fixed output pts computation in case of pcm audio (fixes ffplay status display)
authorFabrice Bellard <fabrice@bellard.org>
Tue, 19 Nov 2002 18:30:03 +0000 (18:30 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Tue, 19 Nov 2002 18:30:03 +0000 (18:30 +0000)
Originally committed as revision 1231 to svn://svn.ffmpeg.org/ffmpeg/trunk

libav/utils.c

index bc706f6..492b3c5 100644 (file)
@@ -751,7 +751,7 @@ int av_write_frame(AVFormatContext *s, int stream_index, const uint8_t *buf,
 {
     AVStream *st;
     INT64 pts_mask;
-    int ret;
+    int ret, frame_size;
 
     st = s->streams[stream_index];
     pts_mask = (1LL << s->pts_wrap_bits) - 1;
@@ -763,8 +763,24 @@ int av_write_frame(AVFormatContext *s, int stream_index, const uint8_t *buf,
     /* update pts */
     switch (st->codec.codec_type) {
     case CODEC_TYPE_AUDIO:
+        if (st->codec.frame_size <= 1) {
+            frame_size = size / st->codec.channels;
+            /* specific hack for pcm codecs because no frame size is provided */
+            switch(st->codec.codec->id) {
+            case CODEC_ID_PCM_S16LE:
+            case CODEC_ID_PCM_S16BE:
+            case CODEC_ID_PCM_U16LE:
+            case CODEC_ID_PCM_U16BE:
+                frame_size >>= 1;
+                break;
+            default:
+                break;
+            }
+        } else {
+            frame_size = st->codec.frame_size;
+        }
         av_frac_add(&st->pts, 
-                    (INT64)s->pts_den * st->codec.frame_size);
+                    (INT64)s->pts_den * frame_size);
         break;
     case CODEC_TYPE_VIDEO:
         av_frac_add(&st->pts,