changeset 5395:af65f63f2063 libavformat

decode qcelp in aiff, implement #1524, patch by Vitor
author bcoudurier
date Mon, 30 Nov 2009 22:01:21 +0000
parents 896dbdababcb
children aec4d71f32e4
files aiff.h aiffdec.c
diffstat 2 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/aiff.h	Sun Nov 29 18:26:51 2009 +0000
+++ b/aiff.h	Mon Nov 30 22:01:21 2009 +0000
@@ -46,6 +46,7 @@
     { CODEC_ID_PCM_S16LE,    MKTAG('s','o','w','t') },
     { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
     { CODEC_ID_QDM2,         MKTAG('Q','D','M','2') },
+    { CODEC_ID_QCELP,        MKTAG('Q','c','l','p') },
     { CODEC_ID_NONE,         0 },
 };
 
--- a/aiffdec.c	Sun Nov 29 18:26:51 2009 +0000
+++ b/aiffdec.c	Mon Nov 30 22:01:21 2009 +0000
@@ -127,6 +127,10 @@
             codec->block_align = 33;
             codec->frame_size = 160;
             break;
+        case CODEC_ID_QCELP:
+            codec->block_align = 35;
+            codec->frame_size= 160;
+            break;
         default:
             break;
         }
@@ -284,7 +288,7 @@
     AVStream *st = s->streams[0];
     AIFFInputContext *aiff = s->priv_data;
     int64_t max_size;
-    int res;
+    int res, size;
 
     /* calculate size of remaining data */
     max_size = aiff->data_end - url_ftell(s->pb);
@@ -292,8 +296,12 @@
         return AVERROR_EOF;
 
     /* Now for that packet */
-    max_size = FFMIN(max_size, (MAX_SIZE / st->codec->block_align) * st->codec->block_align);
-    res = av_get_packet(s->pb, pkt, max_size);
+    if (st->codec->block_align >= 33) // GSM, QCLP, IMA4
+        size = st->codec->block_align;
+    else
+        size = (MAX_SIZE / st->codec->block_align) * st->codec->block_align;
+    size = FFMIN(max_size, size);
+    res = av_get_packet(s->pb, pkt, size);
     if (res < 0)
         return res;