OSDN Git Service

decode qcelp in aiff, implement #1524, patch by Vitor
authorVitor Sessak <vitor1001@gmail.com>
Mon, 30 Nov 2009 22:01:21 +0000 (22:01 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Mon, 30 Nov 2009 22:01:21 +0000 (22:01 +0000)
Originally committed as revision 20674 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/aiff.h
libavformat/aiffdec.c

index e8d4cce..48fecbe 100644 (file)
@@ -46,6 +46,7 @@ static const AVCodecTag ff_codec_aiff_tags[] = {
     { 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 },
 };
 
index 6cc91d4..60c44ea 100644 (file)
@@ -127,6 +127,10 @@ static unsigned int get_aiff_header(ByteIOContext *pb, AVCodecContext *codec,
             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 @@ static int aiff_read_packet(AVFormatContext *s,
     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 @@ static int aiff_read_packet(AVFormatContext *s,
         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;