ivfenc: write duration for frame_cnt=1.
This commit is contained in:
		
							parent
							
								
									82131293b0
								
							
						
					
					
						commit
						d29ec02d48
					
				@ -23,7 +23,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct IVFEncContext {
 | 
					typedef struct IVFEncContext {
 | 
				
			||||||
    unsigned frame_cnt;
 | 
					    unsigned frame_cnt;
 | 
				
			||||||
    uint64_t last_pts, sum_delta_pts;
 | 
					    uint64_t last_pts, sum_delta_pts, last_pkt_duration;
 | 
				
			||||||
} IVFEncContext;
 | 
					} IVFEncContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ivf_init(AVFormatContext *s)
 | 
					static int ivf_init(AVFormatContext *s)
 | 
				
			||||||
@ -86,6 +86,7 @@ static int ivf_write_packet(AVFormatContext *s, AVPacket *pkt)
 | 
				
			|||||||
    avio_write(pb, pkt->data, pkt->size);
 | 
					    avio_write(pb, pkt->data, pkt->size);
 | 
				
			||||||
    if (ctx->frame_cnt)
 | 
					    if (ctx->frame_cnt)
 | 
				
			||||||
        ctx->sum_delta_pts += pkt->pts - ctx->last_pts;
 | 
					        ctx->sum_delta_pts += pkt->pts - ctx->last_pts;
 | 
				
			||||||
 | 
					    ctx->last_pkt_duration = pkt->duration;
 | 
				
			||||||
    ctx->frame_cnt++;
 | 
					    ctx->frame_cnt++;
 | 
				
			||||||
    ctx->last_pts = pkt->pts;
 | 
					    ctx->last_pts = pkt->pts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -97,12 +98,15 @@ static int ivf_write_trailer(AVFormatContext *s)
 | 
				
			|||||||
    AVIOContext *pb = s->pb;
 | 
					    AVIOContext *pb = s->pb;
 | 
				
			||||||
    IVFEncContext *ctx = s->priv_data;
 | 
					    IVFEncContext *ctx = s->priv_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && ctx->frame_cnt > 1) {
 | 
					    if ((pb->seekable & AVIO_SEEKABLE_NORMAL) &&
 | 
				
			||||||
 | 
					        (ctx->frame_cnt > 1 || (ctx->frame_cnt == 1 && ctx->last_pkt_duration))) {
 | 
				
			||||||
        int64_t end = avio_tell(pb);
 | 
					        int64_t end = avio_tell(pb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        avio_seek(pb, 24, SEEK_SET);
 | 
					        avio_seek(pb, 24, SEEK_SET);
 | 
				
			||||||
        // overwrite the "length" field (duration)
 | 
					        // overwrite the "length" field (duration)
 | 
				
			||||||
        avio_wl32(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));
 | 
					        avio_wl32(pb, ctx->last_pkt_duration ?
 | 
				
			||||||
 | 
					                  ctx->sum_delta_pts + ctx->last_pkt_duration :
 | 
				
			||||||
 | 
					                  ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));
 | 
				
			||||||
        avio_wl32(pb, 0); // zero out unused bytes
 | 
					        avio_wl32(pb, 0); // zero out unused bytes
 | 
				
			||||||
        avio_seek(pb, end, SEEK_SET);
 | 
					        avio_seek(pb, end, SEEK_SET);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user