2011/4/28 Aℓex Converse <aconve...@google.com>:
> On Thu, Apr 28, 2011 at 7:35 AM, Justin Ruggles
> <justin.rugg...@gmail.com> wrote:
>> Hi,
>>
>> On 04/27/2011 08:19 PM, Aℓex Converse wrote:
>>
>>> +    frame_size = (h >> 16) & 0xffff;
>>> +    channels = 2 + 2*((h >> 14) & 0x03);
>>> +    id = (h >> 6) & 0xff;
>>> +    bits = 16 + 4*((h >> 4) & 0x03);
>>
>>
>> This would be easier to read if aligned. like this:
>>
>> frame_size =  (h >> 16) & 0xffff;
>> channels   = ((h >> 14) & 0x0003) * 2 + 2;
>> id         =  (h >>  6) & 0x00ff;
>> bits       = ((h >>  4) & 0x0003) * 4 + 16;
>>
>>> +    int frame_size, buf_size = avpkt->size;
>>> +
>>> +    frame_size = s302m_parse_frame_header(avctx, buf, buf_size);
>>> +    if (frame_size < 0)
>>> +        return -1;
>>
>>
>> frame_size isn't used anywhere else in this function, so it is not needed.
>>
>>> +    if (avctx->bits_per_coded_sample == 24) {
>> ...
>>> +        *data_size = (uint8_t*)o - (uint8_t*)data;
>>> +    } else if (avctx->bits_per_coded_sample == 20) {
>> ...
>>> +        *data_size = (uint8_t*)o - (uint8_t*)data;
>>> +    } else {
>> ...
>>> +        *data_size = (uint8_t*)o - (uint8_t*)data;
>>> +    }
>>
>>
>> the 3 duplicate lines can be moved to after the if/else.
>>
>
> This gets messy because o is a different type in the final else.
>

Updated patch attached with this unfixed.
From ae6ab08ce8032bf1068283b21b6383968675d186 Mon Sep 17 00:00:00 2001
From: Baptiste Coudurier <baptiste.coudur...@gmail.com>
Date: Tue, 12 Apr 2011 15:29:09 -0700
Subject: [PATCH] Port s302m decoder from FFmbc 0.3.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------1"

This is a multi-part message in MIME format.
--------------1
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit


Ported-by: Alex Converse <aconve...@google.com>
---
 Changelog              |    1 +
 libavcodec/Makefile    |    1 +
 libavcodec/allcodecs.c |    1 +
 libavcodec/avcodec.h   |    1 +
 libavcodec/s302m.c     |  141 ++++++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/version.h   |    4 +-
 libavformat/mpegts.c   |    1 +
 7 files changed, 148 insertions(+), 2 deletions(-)
 create mode 100644 libavcodec/s302m.c


--------------1
Content-Type: text/x-patch; name="0001-Port-s302m-decoder-from-FFmbc-0.3.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="0001-Port-s302m-decoder-from-FFmbc-0.3.patch"

diff --git a/Changelog b/Changelog
index 144f55c..19dfd23 100644
--- a/Changelog
+++ b/Changelog
@@ -6,6 +6,7 @@ version <next>:
 
 - Lots of deprecated API cruft removed
 - fft and imdct optimizations for AVX (Sandy Bridge) processors
+- s302m AES3 audio decoder
 
 version 0.7_beta1:
 
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index fad435d..47dbfe1 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -323,6 +323,7 @@ OBJS-$(CONFIG_RV30_DECODER)            += rv30.o rv34.o rv30dsp.o        \
                                           mpegvideo.o error_resilience.o
 OBJS-$(CONFIG_RV40_DECODER)            += rv40.o rv34.o rv40dsp.o        \
                                           mpegvideo.o error_resilience.o
+OBJS-$(CONFIG_S302M_DECODER)           += s302m.o
 OBJS-$(CONFIG_SGI_DECODER)             += sgidec.o
 OBJS-$(CONFIG_SGI_ENCODER)             += sgienc.o rle.o
 OBJS-$(CONFIG_SHORTEN_DECODER)         += shorten.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 40a7e23..aa2e7dc 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -177,6 +177,7 @@ void avcodec_register_all(void)
     REGISTER_ENCDEC  (RV20, rv20);
     REGISTER_DECODER (RV30, rv30);
     REGISTER_DECODER (RV40, rv40);
+    REGISTER_DECODER (S302M, s302m);
     REGISTER_ENCDEC  (SGI, sgi);
     REGISTER_DECODER (SMACKER, smacker);
     REGISTER_DECODER (SMC, smc);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index eb5c5b3..b362909 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -232,6 +232,7 @@ enum CodecID {
     CODEC_ID_PCM_F64LE,
     CODEC_ID_PCM_BLURAY,
     CODEC_ID_PCM_LXF,
+    CODEC_ID_S302M,
 
     /* various ADPCM codecs */
     CODEC_ID_ADPCM_IMA_QT= 0x11000,
diff --git a/libavcodec/s302m.c b/libavcodec/s302m.c
new file mode 100644
index 0000000..e6980ce
--- /dev/null
+++ b/libavcodec/s302m.c
@@ -0,0 +1,141 @@
+/*
+ * SMPTE 302M decoder
+ * Copyright (c) 2008 Laurent Aimar <fen...@videolan.org>
+ * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudur...@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "libavutil/intreadwrite.h"
+
+#define AES3_HEADER_LEN 4
+
+static int s302m_parse_frame_header(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
+{
+    uint32_t h;
+    int frame_size, channels, id, bits;
+
+    if (buf_size <= AES3_HEADER_LEN) {
+        av_log(avctx, AV_LOG_ERROR, "frame is too short\n");
+        return -1;
+    }
+
+    /*
+     * AES3 header :
+     * size:            16
+     * number channels   2
+     * channel_id        8
+     * bits per samples  2
+     * alignments        4
+     */
+
+    h          = AV_RB32(buf);
+    frame_size =  (h >> 16) & 0xffff;
+    channels   = ((h >> 14) & 0x03) * 2 + 2;
+    id         =  (h >>  6) & 0xff;
+    bits       = ((h >>  4) & 0x03) * 4 + 16;
+
+    if (AES3_HEADER_LEN + frame_size != buf_size || bits > 24) {
+        av_log(avctx, AV_LOG_ERROR, "frame has invalid header\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    /* Set output properties */
+    avctx->bits_per_coded_sample = bits;
+    if (bits > 16)
+        avctx->sample_fmt = SAMPLE_FMT_S32;
+    else
+        avctx->sample_fmt = SAMPLE_FMT_S16;
+
+    avctx->channels = channels;
+    avctx->sample_rate = 48000;
+    avctx->bit_rate = 48000*avctx->channels*(avctx->bits_per_coded_sample+4) +
+        32*(48000/(buf_size*8/(avctx->channels*(avctx->bits_per_coded_sample+4))));
+
+    return frame_size;
+}
+
+static int s302m_decode_frame(AVCodecContext *avctx,
+                              void *data, int *data_size,
+                              AVPacket *avpkt)
+{
+    const uint8_t *buf = avpkt->data;
+    int frame_size, buf_size = avpkt->size;
+
+    frame_size = s302m_parse_frame_header(avctx, buf, buf_size);
+    if (frame_size < 0)
+        return frame_size;
+
+    buf_size -= AES3_HEADER_LEN;
+    buf      += AES3_HEADER_LEN;
+
+    if (*data_size < 4*buf_size*8/(avctx->bits_per_coded_sample+4))
+        return -1;
+
+    if (avctx->bits_per_coded_sample == 24) {
+        uint32_t *o = data;
+        for (; buf_size > 6; buf_size -= 7) {
+            *o++ = (av_reverse[buf[2]]      << 24) |
+                   (av_reverse[buf[1]]      << 16) |
+                   (av_reverse[buf[0]]      <<  8);
+            *o++ = (av_reverse[buf[6]&0xf0] << 28) |
+                   (av_reverse[buf[5]]      << 20) |
+                   (av_reverse[buf[4]]      << 12) |
+                   (av_reverse[buf[3]&0x0f] <<  8);
+            buf += 7;
+        }
+        *data_size = (uint8_t*)o - (uint8_t*)data;
+    } else if (avctx->bits_per_coded_sample == 20) {
+        uint32_t *o = data;
+        for (; buf_size > 5; buf_size -= 6) {
+            *o++ = (av_reverse[buf[2]&0xf0] << 28) |
+                   (av_reverse[buf[1]]      << 20) |
+                   (av_reverse[buf[0]]      << 12);
+            *o++ = (av_reverse[buf[5]&0xf0] << 28) |
+                   (av_reverse[buf[4]]      << 20) |
+                   (av_reverse[buf[3]]      << 12);
+            buf += 6;
+        }
+        *data_size = (uint8_t*)o - (uint8_t*)data;
+    } else {
+        uint16_t *o = data;
+        for (; buf_size > 4; buf_size -= 5) {
+            *o++ = (av_reverse[buf[1]]      <<  8) |
+                    av_reverse[buf[0]];
+            *o++ = (av_reverse[buf[4]&0xf0] << 12) |
+                   (av_reverse[buf[3]]      <<  4) |
+                    av_reverse[buf[2]&0x0f];
+            buf += 5;
+        }
+        *data_size = (uint8_t*)o - (uint8_t*)data;
+    }
+
+    return buf - avpkt->data;
+}
+
+
+AVCodec ff_s302m_decoder = {
+    .name           = "s302m",
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = CODEC_ID_S302M,
+    .priv_data_size = 0,
+    .init           = NULL,
+    .close          = NULL,
+    .decode         = s302m_decode_frame,
+    .long_name      = NULL_IF_CONFIG_SMALL("SMPTE 302M"),
+};
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 418e275..d840fbe 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -21,8 +21,8 @@
 #define AVCODEC_VERSION_H
 
 #define LIBAVCODEC_VERSION_MAJOR 53
-#define LIBAVCODEC_VERSION_MINOR  1
-#define LIBAVCODEC_VERSION_MICRO  1
+#define LIBAVCODEC_VERSION_MINOR  2
+#define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index d7f2c0c..606ae3f 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -524,6 +524,7 @@ static const StreamType MISC_types[] = {
 static const StreamType REGD_types[] = {
     { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC },
     { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO,   CODEC_ID_AC3 },
+    { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, CODEC_ID_S302M },
     { 0 },
 };
 

--------------1--


_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to