nutenc: keep track if keyframe PTS
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 19 Aug 2012 21:33:47 +0000 (23:33 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 26 Aug 2012 20:15:19 +0000 (22:15 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/nut.h
libavformat/nutenc.c

index cac6870..2d16f3e 100644 (file)
@@ -79,6 +79,7 @@ typedef struct {
     int msb_pts_shift;
     int max_pts_distance;
     int decode_delay; //FIXME duplicate of has_b_frames
+    int64_t *keyframe_pts;
 } StreamContext;
 
 typedef struct {
index 617ffb0..00f4653 100644 (file)
@@ -750,6 +750,17 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt){
         put_packet(nut, bc, dyn_bc, 1, SYNCPOINT_STARTCODE);
 
         ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0/*unused*/, pkt->dts);
+
+        if((1ll<<60) % nut->sp_count == 0)
+            for(i=0; i<s->nb_streams; i++){
+                int j;
+                StreamContext *nus = &nut->stream[i];
+                nus->keyframe_pts = av_realloc(nus->keyframe_pts, 2*nut->sp_count*sizeof(*nus->keyframe_pts));
+                if(!nus->keyframe_pts)
+                    return AVERROR(ENOMEM);
+                for(j=nut->sp_count == 1 ? 0 : nut->sp_count; j<2*nut->sp_count; j++)
+                    nus->keyframe_pts[j] = AV_NOPTS_VALUE;
+        }
     }
     av_assert0(nus->last_pts != AV_NOPTS_VALUE);
 
@@ -840,7 +851,7 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt){
     nus->last_pts= pkt->pts;
 
     //FIXME just store one per syncpoint
-    if(flags & FLAG_KEY)
+    if(flags & FLAG_KEY) {
         av_add_index_entry(
             s->streams[pkt->stream_index],
             nut->last_syncpoint_pos,
@@ -848,6 +859,9 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt){
             0,
             0,
             AVINDEX_KEYFRAME);
+        if(nus->keyframe_pts && nus->keyframe_pts[nut->sp_count] == AV_NOPTS_VALUE)
+            nus->keyframe_pts[nut->sp_count] = pkt->pts;
+    }
 
     return 0;
 }
@@ -855,11 +869,15 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt){
 static int nut_write_trailer(AVFormatContext *s){
     NUTContext *nut= s->priv_data;
     AVIOContext *bc= s->pb;
+    int i;
 
     while(nut->header_count<3)
         write_headers(s, bc);
     avio_flush(bc);
     ff_nut_free_sp(nut);
+    for(i=0; i<s->nb_streams; i++)
+        av_freep(&nut->stream[i].keyframe_pts);
+
     av_freep(&nut->stream);
     av_freep(&nut->chapter);
     av_freep(&nut->time_base);