[FFmpeg-cvslog] avcodec/osq: improve 32bit sample format decoding

Paul B Mahol git at videolan.org
Mon Sep 4 15:11:08 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Sep  4 14:13:45 2023 +0200| [c4ab17a62dedba74a2fd8221a8346d4a403813a1] | committer: Paul B Mahol

avcodec/osq: improve 32bit sample format decoding

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c4ab17a62dedba74a2fd8221a8346d4a403813a1
---

 libavcodec/osq.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/libavcodec/osq.c b/libavcodec/osq.c
index ac091ebc3d..df9099f20f 100644
--- a/libavcodec/osq.c
+++ b/libavcodec/osq.c
@@ -50,6 +50,7 @@ typedef struct OSQContext {
     size_t max_framesize;
     size_t bitstream_size;
 
+    int factor;
     int decorrelate;
     int frame_samples;
     uint64_t nb_samples;
@@ -97,16 +98,19 @@ static av_cold int osq_init(AVCodecContext *avctx)
     if (avctx->ch_layout.nb_channels > FF_ARRAY_ELEMS(s->decode_buffer))
         return AVERROR_INVALIDDATA;
 
+    s->factor = 1;
     switch (avctx->extradata[2]) {
     case  8: avctx->sample_fmt = AV_SAMPLE_FMT_U8P; break;
     case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16P; break;
     case 20:
     case 24:
     case 28:
-    case 32: avctx->sample_fmt = AV_SAMPLE_FMT_S32P; break;
+    case 32: s->factor = 1 << (32 - avctx->extradata[2]);
+             avctx->sample_fmt = AV_SAMPLE_FMT_S32P; break;
     default: return AVERROR_INVALIDDATA;
     }
 
+    avctx->bits_per_raw_sample = avctx->extradata[2];
     s->nb_samples = AV_RL64(avctx->extradata + 16);
     s->frame_samples = AV_RL16(avctx->extradata + 8);
     s->max_framesize = (s->frame_samples * 16 + 1024) * avctx->ch_layout.nb_channels;
@@ -339,7 +343,9 @@ static int do_decode(AVCodecContext *avctx, AVFrame *frame, int decorrelate, int
 static int osq_decode_block(AVCodecContext *avctx, AVFrame *frame)
 {
     const int nb_channels = avctx->ch_layout.nb_channels;
+    const int nb_samples = frame->nb_samples;
     OSQContext *s = avctx->priv_data;
+    const int factor = s->factor;
     int ret, decorrelate, downsample;
     GetBitContext *gb = &s->gb;
 
@@ -365,7 +371,7 @@ static int osq_decode_block(AVCodecContext *avctx, AVFrame *frame)
             uint8_t *dst = (uint8_t *)frame->extended_data[ch];
             int32_t *src = s->decode_buffer[ch] + OFFSET;
 
-            for (int n = 0; n < frame->nb_samples; n++)
+            for (int n = 0; n < nb_samples; n++)
                 dst[n] = av_clip_uint8(src[n] + 0x80);
         }
         break;
@@ -374,7 +380,7 @@ static int osq_decode_block(AVCodecContext *avctx, AVFrame *frame)
             int16_t *dst = (int16_t *)frame->extended_data[ch];
             int32_t *src = s->decode_buffer[ch] + OFFSET;
 
-            for (int n = 0; n < frame->nb_samples; n++)
+            for (int n = 0; n < nb_samples; n++)
                 dst[n] = (int16_t)src[n];
         }
         break;
@@ -383,8 +389,8 @@ static int osq_decode_block(AVCodecContext *avctx, AVFrame *frame)
             int32_t *dst = (int32_t *)frame->extended_data[ch];
             int32_t *src = s->decode_buffer[ch] + OFFSET;
 
-            for (int n = 0; n < frame->nb_samples; n++)
-                dst[n] = src[n];
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = src[n] * factor;
         }
         break;
     default:



More information about the ffmpeg-cvslog mailing list