[FFmpeg-devel] [PATCH] avcodec/als: use planar sample formats

Paul B Mahol onemda at gmail.com
Sat Jul 1 23:23:06 EEST 2017


This is native layout of this codec.

Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
 libavcodec/alsdec.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/libavcodec/alsdec.c b/libavcodec/alsdec.c
index 4a8f13d..31e95e2 100644
--- a/libavcodec/alsdec.c
+++ b/libavcodec/alsdec.c
@@ -1790,25 +1790,28 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
         return ret;
 
     // transform decoded frame into output format
-    #define INTERLEAVE_OUTPUT(bps)                                                   \
+    #define SHIFT_OUTPUT(bps)                                                        \
     {                                                                                \
-        int##bps##_t *dest = (int##bps##_t*)frame->data[0];                          \
         shift = bps - ctx->avctx->bits_per_raw_sample;                               \
         if (!ctx->cs_switch) {                                                       \
-            for (sample = 0; sample < ctx->cur_frame_length; sample++)               \
-                for (c = 0; c < avctx->channels; c++)                                \
+            for (c = 0; c < avctx->channels; c++) {                                  \
+                int##bps##_t *dest = (int##bps##_t*)frame->extended_data[c];         \
+                for (sample = 0; sample < ctx->cur_frame_length; sample++)           \
                     *dest++ = ctx->raw_samples[c][sample] << shift;                  \
+            }                                                                        \
         } else {                                                                     \
-            for (sample = 0; sample < ctx->cur_frame_length; sample++)               \
-                for (c = 0; c < avctx->channels; c++)                                \
+            for (c = 0; c < avctx->channels; c++) {                                  \
+                int##bps##_t *dest = (int##bps##_t*)frame->extended_data[c];         \
+                for (sample = 0; sample < ctx->cur_frame_length; sample++)           \
                     *dest++ = ctx->raw_samples[sconf->chan_pos[c]][sample] << shift; \
+            }                                                                        \
         }                                                                            \
     }
 
     if (ctx->avctx->bits_per_raw_sample <= 16) {
-        INTERLEAVE_OUTPUT(16)
+        SHIFT_OUTPUT(16)
     } else {
-        INTERLEAVE_OUTPUT(32)
+        SHIFT_OUTPUT(32)
     }
 
     // update CRC
@@ -1960,11 +1963,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
             goto fail;
     }
     if (sconf->floating) {
-        avctx->sample_fmt          = AV_SAMPLE_FMT_FLT;
+        avctx->sample_fmt          = AV_SAMPLE_FMT_FLTP;
         avctx->bits_per_raw_sample = 32;
     } else {
         avctx->sample_fmt          = sconf->resolution > 1
-                                     ? AV_SAMPLE_FMT_S32 : AV_SAMPLE_FMT_S16;
+                                     ? AV_SAMPLE_FMT_S32P : AV_SAMPLE_FMT_S16P;
         avctx->bits_per_raw_sample = (sconf->resolution + 1) * 8;
         if (avctx->bits_per_raw_sample > 32) {
             av_log(avctx, AV_LOG_ERROR, "Bits per raw sample %d larger than 32.\n",
-- 
2.9.3



More information about the ffmpeg-devel mailing list