8svx: use planar sample format
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 27 Aug 2012 16:01:16 +0000 (12:01 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Mon, 1 Oct 2012 17:42:43 +0000 (13:42 -0400)
libavcodec/8svx.c

index 328fc65..1839617 100644 (file)
@@ -58,30 +58,25 @@ static const int8_t exponential[16] = { -128, -64, -32, -16, -8, -4, -2, -1,
  * @param[in,out] state starting value. it is saved for use in the next call.
  */
 static void delta_decode(uint8_t *dst, const uint8_t *src, int src_size,
-                         uint8_t *state, const int8_t *table, int channels)
+                         uint8_t *state, const int8_t *table)
 {
     uint8_t val = *state;
 
     while (src_size--) {
         uint8_t d = *src++;
         val = av_clip_uint8(val + table[d & 0xF]);
-        *dst = val;
-        dst += channels;
+        *dst++ = val;
         val = av_clip_uint8(val + table[d >> 4]);
-        *dst = val;
-        dst += channels;
+        *dst++ = val;
     }
 
     *state = val;
 }
 
-static void raw_decode(uint8_t *dst, const int8_t *src, int src_size,
-                       int channels)
+static void raw_decode(uint8_t *dst, const int8_t *src, int src_size)
 {
-    while (src_size--) {
-        *dst = *src++ + 128;
-        dst += channels;
-    }
+    while (src_size--)
+        *dst++ = *src++ + 128;
 }
 
 /** decode a frame */
@@ -90,8 +85,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
 {
     EightSvxContext *esc = avctx->priv_data;
     int buf_size;
-    uint8_t *out_data;
-    int ret;
+    int ch, ret;
     int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR);
 
     /* for the first packet, copy data to buffer */
@@ -146,22 +140,17 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
         return ret;
     }
-    out_data = esc->frame.data[0];
-
-    if (is_compr) {
-    delta_decode(out_data, &esc->data[0][esc->data_idx], buf_size,
-                 &esc->fib_acc[0], esc->table, avctx->channels);
-    if (avctx->channels == 2) {
-        delta_decode(&out_data[1], &esc->data[1][esc->data_idx], buf_size,
-                    &esc->fib_acc[1], esc->table, avctx->channels);
-    }
-    } else {
-        int ch;
-        for (ch = 0; ch < avctx->channels; ch++) {
-            raw_decode((int8_t *)&out_data[ch], &esc->data[ch][esc->data_idx],
-                       buf_size, avctx->channels);
+
+    for (ch = 0; ch < avctx->channels; ch++) {
+        if (is_compr) {
+            delta_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
+                         buf_size, &esc->fib_acc[ch], esc->table);
+        } else {
+            raw_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
+                       buf_size);
         }
     }
+
     esc->data_idx += buf_size;
 
     *got_frame_ptr   = 1;
@@ -192,7 +181,7 @@ static av_cold int eightsvx_decode_init(AVCodecContext *avctx)
         default:
           return -1;
     }
-    avctx->sample_fmt = AV_SAMPLE_FMT_U8;
+    avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
 
     avcodec_get_frame_defaults(&esc->frame);
     avctx->coded_frame = &esc->frame;
@@ -220,6 +209,8 @@ AVCodec ff_eightsvx_fib_decoder = {
   .decode         = eightsvx_decode_frame,
   .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
   .long_name      = NULL_IF_CONFIG_SMALL("8SVX fibonacci"),
+  .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
+                                                    AV_SAMPLE_FMT_NONE },
 };
 
 AVCodec ff_eightsvx_exp_decoder = {
@@ -232,6 +223,8 @@ AVCodec ff_eightsvx_exp_decoder = {
   .decode         = eightsvx_decode_frame,
   .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
   .long_name      = NULL_IF_CONFIG_SMALL("8SVX exponential"),
+  .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
+                                                    AV_SAMPLE_FMT_NONE },
 };
 
 AVCodec ff_pcm_s8_planar_decoder = {
@@ -244,4 +237,6 @@ AVCodec ff_pcm_s8_planar_decoder = {
     .decode         = eightsvx_decode_frame,
     .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
     .long_name      = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"),
+    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
+                                                      AV_SAMPLE_FMT_NONE },
 };