[FFmpeg-cvslog] shorten: unsigned 8bit support

Paul B Mahol git at videolan.org
Fri May 4 12:01:43 CEST 2012


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu May  3 10:29:21 2012 +0000| [b7159877b18f6f0262180574cb7163ca6ab664c6] | committer: Paul B Mahol

shorten: unsigned 8bit support

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

 libavcodec/shorten.c |   50 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c
index ece651d..18b8012 100644
--- a/libavcodec/shorten.c
+++ b/libavcodec/shorten.c
@@ -49,8 +49,12 @@
 #define ENERGYSIZE 3
 #define BITSHIFTSIZE 2
 
+#define TYPE_S8    1
+#define TYPE_U8    2
 #define TYPE_S16HL 3
+#define TYPE_U16HL 4
 #define TYPE_S16LH 5
+#define TYPE_U16LH 6
 
 #define NWRAP 3
 #define NSKIPSIZE 1
@@ -112,7 +116,6 @@ static av_cold int shorten_decode_init(AVCodecContext * avctx)
 {
     ShortenContext *s = avctx->priv_data;
     s->avctx = avctx;
-    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
 
     avcodec_get_frame_defaults(&s->frame);
     avctx->coded_frame = &s->frame;
@@ -186,9 +189,13 @@ static int init_offset(ShortenContext *s)
     /* initialise offset */
     switch (s->internal_ftype)
     {
+        case TYPE_U8:
+            s->avctx->sample_fmt = AV_SAMPLE_FMT_U8;
+            mean = 0x80;
+            break;
         case TYPE_S16HL:
         case TYPE_S16LH:
-            mean = 0;
+            s->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
             break;
         default:
             av_log(s->avctx, AV_LOG_ERROR, "unknown audio type\n");
@@ -204,7 +211,7 @@ static int init_offset(ShortenContext *s)
 static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
                               int header_size)
 {
-    int len;
+    int len, bps;
     short wave_format;
     const uint8_t *end= header + header_size;
 
@@ -247,10 +254,11 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
     avctx->sample_rate = bytestream_get_le32(&header);
     header += 4;        // skip bit rate    (represents original uncompressed bit rate)
     header += 2;        // skip block align (not needed)
-    avctx->bits_per_coded_sample = bytestream_get_le16(&header);
+    bps     = bytestream_get_le16(&header);
+    avctx->bits_per_coded_sample = bps;
 
-    if (avctx->bits_per_coded_sample != 16) {
-        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample\n");
+    if (bps != 16 && bps != 8) {
+        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps);
         return -1;
     }
 
@@ -261,15 +269,6 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
     return 0;
 }
 
-static void interleave_buffer(int16_t *samples, int nchan, int blocksize,
-                              int32_t **buffer)
-{
-    int i, chan;
-    for (i=0; i<blocksize; i++)
-        for (chan=0; chan < nchan; chan++)
-            *samples++ = av_clip_int16(buffer[chan][i]);
-}
-
 static const int fixed_coeffs[3][3] = {
     { 1,  0,  0 },
     { 2, -1,  0 },
@@ -578,15 +577,32 @@ static int shorten_decode_frame(AVCodecContext *avctx, void *data,
             /* if this is the last channel in the block, output the samples */
             s->cur_chan++;
             if (s->cur_chan == s->channels) {
+                uint8_t *samples_u8;
+                int16_t *samples_s16;
+                int chan;
+
                 /* get output buffer */
                 s->frame.nb_samples = s->blocksize;
                 if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
                     av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
                     return ret;
                 }
+                samples_u8  = (uint8_t *)s->frame.data[0];
+                samples_s16 = (int16_t *)s->frame.data[0];
                 /* interleave output */
-                interleave_buffer((int16_t *)s->frame.data[0], s->channels,
-                                  s->blocksize, s->decoded);
+                for (i = 0; i < s->blocksize; i++) {
+                    for (chan = 0; chan < s->channels; chan++) {
+                        switch (s->internal_ftype) {
+                        case TYPE_U8:
+                            *samples_u8++ = av_clip_uint8(s->decoded[chan][i]);
+                            break;
+                        case TYPE_S16HL:
+                        case TYPE_S16LH:
+                            *samples_s16++ = av_clip_int16(s->decoded[chan][i]);
+                            break;
+                        }
+                    }
+                }
 
                 *got_frame_ptr   = 1;
                 *(AVFrame *)data = s->frame;



More information about the ffmpeg-cvslog mailing list