[FFmpeg-devel] [PATCH] simplify ipmovie pts calculation

Reimar Döffinger Reimar.Doeffinger
Sun Sep 28 11:12:58 CEST 2008


Hello,
as mentioned here: http://multimedia.cx/eggs/baldur-in-bulk/ the ipmovie
pts stuff is a bit of a mess.
While fixing that will actually worsen the situation when encoding with
bitrate without specifying a frame rate to x264 (since x264 will now not
just assume 90000 fps but 1000000 fps), the previous code was needlessly
complex.
My change is untested though, and the cast to uint64_t when calculating
frame_pts_inc is probably an unrelated change (actually I do not know
for sure if not maybe the old code is correct, it did look odd though).

Greetings,
Reimar D?ffinger
-------------- next part --------------
Index: libavformat/ipmovie.c
===================================================================
--- libavformat/ipmovie.c	(revision 15413)
+++ libavformat/ipmovie.c	(working copy)
@@ -91,8 +91,7 @@
     unsigned char *buf;
     int buf_size;
 
-    float fps;
-    int frame_pts_inc;
+    uint64_t frame_pts_inc;
 
     unsigned int video_width;
     unsigned int video_height;
@@ -124,7 +123,6 @@
     AVPacket *pkt) {
 
     int chunk_type;
-    int64_t audio_pts = 0;
 
     if (s->audio_chunk_offset) {
 
@@ -137,16 +135,11 @@
         url_fseek(pb, s->audio_chunk_offset, SEEK_SET);
         s->audio_chunk_offset = 0;
 
-        /* figure out the audio pts */
-        audio_pts = 90000;
-        audio_pts *= s->audio_frame_count;
-        audio_pts /= s->audio_sample_rate;
-
         if (s->audio_chunk_size != av_get_packet(pb, pkt, s->audio_chunk_size))
             return CHUNK_EOF;
 
         pkt->stream_index = s->audio_stream_index;
-        pkt->pts = audio_pts;
+        pkt->pts = s->audio_frame_count;
 
         /* audio frame maintenance */
         if (s->audio_type != CODEC_ID_INTERPLAY_DPCM)
@@ -157,7 +150,7 @@
                 (s->audio_chunk_size - 6) / s->audio_channels;
 
         debug_ipmovie("sending audio frame with pts %"PRId64" (%d audio frames)\n",
-            audio_pts, s->audio_frame_count);
+            pkt->pts, s->audio_frame_count);
 
         chunk_type = CHUNK_VIDEO;
 
@@ -325,10 +318,9 @@
                 chunk_type = CHUNK_BAD;
                 break;
             }
-            s->fps = 1000000.0 / (AV_RL32(&scratch[0]) * AV_RL16(&scratch[4]));
-            s->frame_pts_inc = 90000 / s->fps;
+            s->frame_pts_inc = ((uint64_t)AV_RL32(&scratch[0])) * AV_RL16(&scratch[4]);
             debug_ipmovie("  %.2f frames/second (timer div = %d, subdiv = %d)\n",
-                s->fps, AV_RL32(&scratch[0]), AV_RL16(&scratch[4]));
+                1000000.0/s->frame_pts_inc, AV_RL32(&scratch[0]), AV_RL16(&scratch[4]));
             break;
 
         case OPCODE_INIT_AUDIO_BUFFERS:
@@ -552,7 +544,7 @@
     st = av_new_stream(s, 0);
     if (!st)
         return AVERROR(ENOMEM);
-    av_set_pts_info(st, 33, 1, 90000);
+    av_set_pts_info(st, 63, 1, 1000000);
     ipmovie->video_stream_index = st->index;
     st->codec->codec_type = CODEC_TYPE_VIDEO;
     st->codec->codec_id = CODEC_ID_INTERPLAY_VIDEO;
@@ -567,7 +559,7 @@
         st = av_new_stream(s, 0);
         if (!st)
             return AVERROR(ENOMEM);
-        av_set_pts_info(st, 33, 1, 90000);
+        av_set_pts_info(st, 32, 1, ipmovie->audio_sample_rate);
         ipmovie->audio_stream_index = st->index;
         st->codec->codec_type = CODEC_TYPE_AUDIO;
         st->codec->codec_id = ipmovie->audio_type;



More information about the ffmpeg-devel mailing list