aiffdec: do not set AVCodecContext.frame_size
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 27 Feb 2012 03:55:52 +0000 (22:55 -0500)
committerJustin Ruggles <justin.ruggles@gmail.com>
Mon, 5 Mar 2012 18:08:17 +0000 (13:08 -0500)
It is unnecessary. Also, for some codecs we're reading more than 1 frame per
packet. Instead we use a private context variable to calculate the bit rate,
stream duration, and packet durations.

Updated FATE seek test, which has slightly different timestamps due to a
more accurate bit rate calculation.

libavformat/aiffdec.c
tests/ref/seek/adpcm_qt_aiff

index b3cbc11..11bbcac 100644 (file)
@@ -31,6 +31,7 @@
 
 typedef struct {
     int64_t data_end;
+    int block_duration;
 } AIFFInputContext;
 
 static enum CodecID aiff_codec_get_id(int bps)
@@ -85,9 +86,12 @@ static void get_meta(AVFormatContext *s, const char *key, int size)
 }
 
 /* Returns the number of sound data frames or negative on error */
-static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec,
-                             int size, unsigned version)
+static unsigned int get_aiff_header(AVFormatContext *s, int size,
+                                    unsigned version)
 {
+    AVIOContext *pb        = s->pb;
+    AVCodecContext *codec  = s->streams[0]->codec;
+    AIFFInputContext *aiff = s->priv_data;
     int exp;
     uint64_t val;
     double sample_rate;
@@ -115,26 +119,27 @@ static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec,
         case CODEC_ID_PCM_S16BE:
             codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample);
             codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id);
+            aiff->block_duration = 1;
             break;
         case CODEC_ID_ADPCM_IMA_QT:
             codec->block_align = 34*codec->channels;
-            codec->frame_size = 64;
+            aiff->block_duration = 64;
             break;
         case CODEC_ID_MACE3:
             codec->block_align = 2*codec->channels;
-            codec->frame_size = 6;
+            aiff->block_duration = 6;
             break;
         case CODEC_ID_MACE6:
             codec->block_align = 1*codec->channels;
-            codec->frame_size = 6;
+            aiff->block_duration = 6;
             break;
         case CODEC_ID_GSM:
             codec->block_align = 33;
-            codec->frame_size = 160;
+            aiff->block_duration = 160;
             break;
         case CODEC_ID_QCELP:
             codec->block_align = 35;
-            codec->frame_size= 160;
+            aiff->block_duration = 160;
             break;
         default:
             break;
@@ -144,6 +149,7 @@ static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec,
         /* Need the codec type */
         codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample);
         codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id);
+        aiff->block_duration = 1;
     }
 
     /* Block align needs to be computed in all cases, as the definition
@@ -151,8 +157,8 @@ static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec,
     if (!codec->block_align)
         codec->block_align = (codec->bits_per_coded_sample * codec->channels) >> 3;
 
-    codec->bit_rate = (codec->frame_size ? codec->sample_rate/codec->frame_size :
-                       codec->sample_rate) * (codec->block_align << 3);
+    codec->bit_rate = codec->sample_rate * (codec->block_align << 3) /
+                      aiff->block_duration;
 
     /* Chunk is over */
     if (size)
@@ -213,7 +219,7 @@ static int aiff_read_header(AVFormatContext *s)
         switch (tag) {
         case MKTAG('C', 'O', 'M', 'M'):     /* Common chunk */
             /* Then for the complete header info */
-            st->nb_frames = get_aiff_header(pb, st->codec, size, version);
+            st->nb_frames = get_aiff_header(s, size, version);
             if (st->nb_frames < 0)
                 return st->nb_frames;
             if (offset > 0) // COMM is after SSND
@@ -272,8 +278,7 @@ got_sound:
     /* Now positioned, get the sound data start and end */
     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
     st->start_time = 0;
-    st->duration = st->codec->frame_size ?
-        st->nb_frames * st->codec->frame_size : st->nb_frames;
+    st->duration = st->nb_frames * aiff->block_duration;
 
     /* Position the stream at the first block */
     avio_seek(pb, offset, SEEK_SET);
@@ -308,6 +313,7 @@ static int aiff_read_packet(AVFormatContext *s,
 
     /* Only one stream in an AIFF file */
     pkt->stream_index = 0;
+    pkt->duration     = (res / st->codec->block_align) * aiff->block_duration;
     return 0;
 }
 
index b395fc9..bdaf1f0 100644 (file)
@@ -2,52 +2,52 @@ ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 1.894059 pts: 1.894059 pos:  88812 size:    68
+ret: 0         st: 0 flags:1 dts: 1.893878 pts: 1.893878 pos:  88812 size:    68
 ret: 0         st: 0 flags:0  ts: 0.788345
-ret: 0         st: 0 flags:1 dts: 0.789546 pts: 0.789546 pos:  37064 size:    68
+ret: 0         st: 0 flags:1 dts: 0.789478 pts: 0.789478 pos:  37064 size:    68
 ret: 0         st: 0 flags:1  ts:-0.317506
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st:-1 flags:0  ts: 2.576668
-ret: 0         st: 0 flags:1 dts: 2.577642 pts: 2.577642 pos: 120840 size:    68
+ret: 0         st: 0 flags:1 dts: 2.577438 pts: 2.577438 pos: 120840 size:    68
 ret: 0         st:-1 flags:1  ts: 1.470835
-ret: 0         st: 0 flags:1 dts: 1.470249 pts: 1.470249 pos:  68956 size:    68
+ret: 0         st: 0 flags:1 dts: 1.470113 pts: 1.470113 pos:  68956 size:    68
 ret: 0         st: 0 flags:0  ts: 0.365011
-ret: 0         st: 0 flags:1 dts: 0.365737 pts: 0.365737 pos:  17208 size:    68
+ret: 0         st: 0 flags:1 dts: 0.365714 pts: 0.365714 pos:  17208 size:    68
 ret: 0         st: 0 flags:1  ts:-0.740839
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st:-1 flags:0  ts: 2.153336
-ret: 0         st: 0 flags:1 dts: 2.153855 pts: 2.153855 pos: 100984 size:    68
+ret: 0         st: 0 flags:1 dts: 2.153673 pts: 2.153673 pos: 100984 size:    68
 ret: 0         st:-1 flags:1  ts: 1.047503
-ret: 0         st: 0 flags:1 dts: 1.046440 pts: 1.046440 pos:  49100 size:    68
+ret: 0         st: 0 flags:1 dts: 1.046349 pts: 1.046349 pos:  49100 size:    68
 ret: 0         st: 0 flags:0  ts:-0.058322
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st: 0 flags:1  ts: 2.835828
-ret: 0         st: 0 flags:1 dts: 2.834535 pts: 2.834535 pos: 132876 size:    68
+ret: 0         st: 0 flags:1 dts: 2.835760 pts: 2.835760 pos: 132944 size:    68
 ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 0 flags:1 dts: 1.730045 pts: 1.730045 pos:  81128 size:    68
+ret: 0         st: 0 flags:1 dts: 1.731338 pts: 1.731338 pos:  81196 size:    68
 ret: 0         st:-1 flags:1  ts: 0.624171
-ret: 0         st: 0 flags:1 dts: 0.624082 pts: 0.624082 pos:  29312 size:    68
+ret: 0         st: 0 flags:1 dts: 0.624036 pts: 0.624036 pos:  29312 size:    68
 ret: 0         st: 0 flags:0  ts:-0.481655
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st: 0 flags:1  ts: 2.412494
-ret: 0         st: 0 flags:1 dts: 2.412200 pts: 2.412200 pos: 113088 size:    68
+ret: 0         st: 0 flags:1 dts: 2.411995 pts: 2.411995 pos: 113088 size:    68
 ret: 0         st:-1 flags:0  ts: 1.306672
-ret: 0         st: 0 flags:1 dts: 1.307687 pts: 1.307687 pos:  61340 size:    68
+ret: 0         st: 0 flags:1 dts: 1.307574 pts: 1.307574 pos:  61340 size:    68
 ret: 0         st:-1 flags:1  ts: 0.200839
-ret: 0         st: 0 flags:1 dts: 0.200295 pts: 0.200295 pos:   9456 size:    68
+ret: 0         st: 0 flags:1 dts: 0.200272 pts: 0.200272 pos:   9456 size:    68
 ret: 0         st: 0 flags:0  ts:-0.904989
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st: 0 flags:1  ts: 1.989184
-ret: 0         st: 0 flags:1 dts: 1.988390 pts: 1.988390 pos:  93232 size:    68
+ret: 0         st: 0 flags:1 dts: 1.988209 pts: 1.988209 pos:  93232 size:    68
 ret: 0         st:-1 flags:0  ts: 0.883340
-ret: 0         st: 0 flags:1 dts: 0.883900 pts: 0.883900 pos:  41484 size:    68
+ret: 0         st: 0 flags:1 dts: 0.883810 pts: 0.883810 pos:  41484 size:    68
 ret: 0         st:-1 flags:1  ts:-0.222493
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68
 ret: 0         st: 0 flags:0  ts: 2.671678
-ret: 0         st: 0 flags:1 dts: 2.671995 pts: 2.671995 pos: 125260 size:    68
+ret: 0         st: 0 flags:1 dts: 2.671769 pts: 2.671769 pos: 125260 size:    68
 ret: 0         st: 0 flags:1  ts: 1.565850
-ret: 0         st: 0 flags:1 dts: 1.564580 pts: 1.564580 pos:  73376 size:    68
+ret: 0         st: 0 flags:1 dts: 1.564444 pts: 1.564444 pos:  73376 size:    68
 ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:1 dts: 0.460091 pts: 0.460091 pos:  21628 size:    68
+ret: 0         st: 0 flags:1 dts: 0.460045 pts: 0.460045 pos:  21628 size:    68
 ret: 0         st:-1 flags:1  ts:-0.645825
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:     72 size:    68