[FFmpeg-devel] [PATCH]Support half-rate qcelp in aiff

Carl Eugen Hoyos cehoyos at ag.or.at
Tue Apr 23 10:30:08 CEST 2013


Hi!

Attached patch fixes ticket #1287.

Please comment, Carl Eugen
-------------- next part --------------
diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c
index 4a26298..62af3dc 100644
--- a/libavformat/aiffdec.c
+++ b/libavformat/aiffdec.c
@@ -147,9 +147,6 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size,
         case AV_CODEC_ID_GSM:
             codec->block_align = 33;
             break;
-        case AV_CODEC_ID_QCELP:
-            codec->block_align = 35;
-            break;
         default:
             aiff->block_duration = 1;
             break;
@@ -286,6 +283,21 @@ static int aiff_read_header(AVFormatContext *s)
             if (st->codec->codec_id == AV_CODEC_ID_QDM2 && size>=12*4 && !st->codec->block_align) {
                 st->codec->block_align = AV_RB32(st->codec->extradata+11*4);
                 aiff->block_duration = AV_RB32(st->codec->extradata+9*4);
+            } else if (st->codec->codec_id == AV_CODEC_ID_QCELP) {
+                char rate = 0;
+                if (size >= 25)
+                    rate = st->codec->extradata[24];
+                switch (rate) {
+                case 'H': // RATE_HALF
+                    st->codec->block_align = 17;
+                    break;
+                case 'F': // RATE_FULL
+                default:
+                    st->codec->block_align = 35;
+                }
+                aiff->block_duration = 160;
+                st->codec->bit_rate = st->codec->sample_rate * (st->codec->block_align << 3) /
+                                      aiff->block_duration;
             }
             break;
         case MKTAG('C','H','A','N'):
@@ -332,7 +344,7 @@ static int aiff_read_packet(AVFormatContext *s,
         return AVERROR_EOF;
 
     /* Now for that packet */
-    if (st->codec->block_align >= 33) // GSM, QCLP, IMA4
+    if (st->codec->block_align >= 17) // GSM, QCLP, IMA4
         size = st->codec->block_align;
     else
         size = (MAX_SIZE / st->codec->block_align) * st->codec->block_align;


More information about the ffmpeg-devel mailing list