[2/3] nellymoserdec: Use side data to support mid stream sample rate changes

Message ID 1322819839-34912-2-git-send-email-martin@martin.st
State Superseded
Headers show

Commit Message

Martin Storsjö Dec. 2, 2011, 9:57 a.m.
From: Michael Niedermayer <michaelni@gmx.at>

---
 libavcodec/nellymoserdec.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

Comments

Kostya Shishkov Dec. 2, 2011, 10:09 a.m. | #1
On Fri, Dec 02, 2011 at 11:57:18AM +0200, Martin Storsjö wrote:
> From: Michael Niedermayer <michaelni@gmx.at>
> 
> ---
>  libavcodec/nellymoserdec.c |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c
> index 278b6b3..aabd07b 100644
> --- a/libavcodec/nellymoserdec.c
> +++ b/libavcodec/nellymoserdec.c
> @@ -149,6 +149,7 @@ static int decode_tag(AVCodecContext * avctx,
>                        void *data, int *data_size,
>                        AVPacket *avpkt) {
>      const uint8_t *buf = avpkt->data;
> +    const uint8_t *side = av_packet_get_side_data(avpkt, AV_PKT_DATA_FLV_FLAGS, NULL);
>      int buf_size = avpkt->size;
>      NellyMoserDecodeContext *s = avctx->priv_data;
>      int blocks, i, block_size;
> @@ -176,6 +177,16 @@ static int decode_tag(AVCodecContext * avctx,
>       * 22050 Hz - 4
>       * 44100 Hz - 8
>       */
> +    if (side) {
> +        if ((side[0] & 0xf0) == 0x60) { // Custom sample rate
> +            if (blocks > 1 && (1 << ((side[0] >> 2) & 3)) == blocks)
> +                avctx->sample_rate = 11025*(blocks/2);

Give operators some room to breathe.
Beside that the whole patchset LGTM

> +        } else if ((side[0] & 0xf0) == 0x50 && blocks == 1) {
> +            avctx->sample_rate = 8000;
> +        } else if ((side[0] & 0xf0) == 0x40 && blocks == 3) {
> +            avctx->sample_rate = 16000;
> +        }
> +    }
>  
>      for (i=0 ; i<blocks ; i++) {
>          if (avctx->sample_fmt == SAMPLE_FMT_FLT) {
> -- 
> 1.7.3.1
> 
> _______________________________________________
> libav-devel mailing list
> libav-devel@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel

Patch

diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c
index 278b6b3..aabd07b 100644
--- a/libavcodec/nellymoserdec.c
+++ b/libavcodec/nellymoserdec.c
@@ -149,6 +149,7 @@  static int decode_tag(AVCodecContext * avctx,
                       void *data, int *data_size,
                       AVPacket *avpkt) {
     const uint8_t *buf = avpkt->data;
+    const uint8_t *side = av_packet_get_side_data(avpkt, AV_PKT_DATA_FLV_FLAGS, NULL);
     int buf_size = avpkt->size;
     NellyMoserDecodeContext *s = avctx->priv_data;
     int blocks, i, block_size;
@@ -176,6 +177,16 @@  static int decode_tag(AVCodecContext * avctx,
      * 22050 Hz - 4
      * 44100 Hz - 8
      */
+    if (side) {
+        if ((side[0] & 0xf0) == 0x60) { // Custom sample rate
+            if (blocks > 1 && (1 << ((side[0] >> 2) & 3)) == blocks)
+                avctx->sample_rate = 11025*(blocks/2);
+        } else if ((side[0] & 0xf0) == 0x50 && blocks == 1) {
+            avctx->sample_rate = 8000;
+        } else if ((side[0] & 0xf0) == 0x40 && blocks == 3) {
+            avctx->sample_rate = 16000;
+        }
+    }
 
     for (i=0 ; i<blocks ; i++) {
         if (avctx->sample_fmt == SAMPLE_FMT_FLT) {