diff options
Diffstat (limited to 'libmpcodecs')
80 files changed, 191 insertions, 180 deletions
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c index 7bee9379ab..7916a6281f 100644 --- a/libmpcodecs/dec_video.c +++ b/libmpcodecs/dec_video.c @@ -336,7 +336,7 @@ if(!mpi || drop_frame) return 0; // error / skipped frame //vo_draw_image(video_out,mpi); vf=sh_video->vfilter; -ret = vf->put_image(vf,mpi); // apply video filters and call the leaf vo/ve +ret = vf->put_image(vf,mpi, MP_NOPTS_VALUE); // apply video filters and call the leaf vo/ve if(ret>0) vf->control(vf,VFCTRL_DRAW_OSD,NULL); t2=GetTimer()-t2; diff --git a/libmpcodecs/ve_divx4.c b/libmpcodecs/ve_divx4.c index 565713bf99..138c806218 100644 --- a/libmpcodecs/ve_divx4.c +++ b/libmpcodecs/ve_divx4.c @@ -387,7 +387,7 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){ return 0; } -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ ENC_RESULT enc_result; vf->priv->enc_frame.image=mpi->planes[0]; vf->priv->enc_frame.bitstream=mux_v->buffer; diff --git a/libmpcodecs/ve_lavc.c b/libmpcodecs/ve_lavc.c index efc8d7b582..d08d4c4a25 100644 --- a/libmpcodecs/ve_lavc.c +++ b/libmpcodecs/ve_lavc.c @@ -338,7 +338,7 @@ struct vf_priv_s { #define FF_QP2LAMBDA 1 #endif -static int encode_frame(struct vf_instance_s* vf, AVFrame *pic); +static int encode_frame(struct vf_instance_s* vf, AVFrame *pic, double pts); static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, @@ -782,7 +782,7 @@ static int control(struct vf_instance_s* vf, int request, void* data){ switch(request){ case VFCTRL_FLUSH_FRAMES: if(vf->priv->codec->capabilities & CODEC_CAP_DELAY) - while(encode_frame(vf, NULL) > 0); + while(encode_frame(vf, NULL, MP_NOPTS_VALUE) > 0); return CONTROL_TRUE; default: return CONTROL_UNKNOWN; @@ -826,7 +826,7 @@ static double psnr(double d){ return -10.0*log(d)/log(10); } -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ AVFrame *pic= vf->priv->pic; pic->data[0]=mpi->planes[0]; @@ -848,13 +848,17 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ } #endif - return (encode_frame(vf, pic) >= 0); + return (encode_frame(vf, pic, pts) >= 0); } -static int encode_frame(struct vf_instance_s* vf, AVFrame *pic){ +static int encode_frame(struct vf_instance_s* vf, AVFrame *pic, double pts){ const char pict_type_char[5]= {'?', 'I', 'P', 'B', 'S'}; int out_size; + if(pic){ + pic->opaque= malloc(sizeof(pts)); + memcpy(pic->opaque, &pts, sizeof(pts)); + } out_size = avcodec_encode_video(lavc_venc_context, mux_v->buffer, mux_v->buffer_size, pic); @@ -863,7 +867,10 @@ static int encode_frame(struct vf_instance_s* vf, AVFrame *pic){ return 0; } - muxer_write_chunk(mux_v,out_size,lavc_venc_context->coded_frame->key_frame?0x10:0, MP_NOPTS_VALUE, MP_NOPTS_VALUE); + muxer_write_chunk(mux_v,out_size,lavc_venc_context->coded_frame->key_frame?0x10:0, + pts, + *(double*)lavc_venc_context->coded_frame->opaque); + free(lavc_venc_context->coded_frame->opaque); #if LIBAVCODEC_BUILD >= 4643 /* store psnr / pict size / type / qscale */ diff --git a/libmpcodecs/ve_libdv.c b/libmpcodecs/ve_libdv.c index 0f9430f295..3d4fd56a2e 100644 --- a/libmpcodecs/ve_libdv.c +++ b/libmpcodecs/ve_libdv.c @@ -71,13 +71,13 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){ return 0; } -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ dv_encode_full_frame(vf->priv->enc, mpi->planes, (mpi->flags&MP_IMGFLAG_YUV) ? e_dv_color_yuv : e_dv_color_rgb, mux_v->buffer); - muxer_write_chunk(mux_v, 480 * (vf->priv->enc->isPAL ? 300 : 250) , 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE); + muxer_write_chunk(mux_v, 480 * (vf->priv->enc->isPAL ? 300 : 250) , 0x10, pts, pts); return 1; } diff --git a/libmpcodecs/ve_nuv.c b/libmpcodecs/ve_nuv.c index e61ac326ad..7d3706821e 100644 --- a/libmpcodecs/ve_nuv.c +++ b/libmpcodecs/ve_nuv.c @@ -97,7 +97,7 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){ return 0; } -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ struct rtframeheader* ench = (struct rtframeheader*)vf->priv->buffer; uint8_t* data = vf->priv->buffer + FRAMEHEADERSIZE; uint8_t* zdata = vf->priv->zbuffer + FRAMEHEADERSIZE; @@ -175,7 +175,7 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ ench->packetlength = len; le2me_rtframeheader(ench); mux_v->buffer=(void*)ench; - muxer_write_chunk(mux_v, len + FRAMEHEADERSIZE, 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE); + muxer_write_chunk(mux_v, len + FRAMEHEADERSIZE, 0x10, pts, pts); return 1; } diff --git a/libmpcodecs/ve_qtvideo.c b/libmpcodecs/ve_qtvideo.c index 0d6fe172f5..6050e59860 100644 --- a/libmpcodecs/ve_qtvideo.c +++ b/libmpcodecs/ve_qtvideo.c @@ -172,7 +172,7 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){ static int codec_inited = 0; -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ OSErr cres; long framesizemax; diff --git a/libmpcodecs/ve_raw.c b/libmpcodecs/ve_raw.c index 8557eae1da..aeffee2e64 100644 --- a/libmpcodecs/ve_raw.c +++ b/libmpcodecs/ve_raw.c @@ -115,9 +115,9 @@ static int query_format(struct vf_instance_s *vf, unsigned int fmt) { return 0; } -static int put_image(struct vf_instance_s *vf, mp_image_t *mpi) { +static int put_image(struct vf_instance_s *vf, mp_image_t *mpi, double pts) { mux_v->buffer = mpi->planes[0]; - muxer_write_chunk(mux_v, mpi->width*mpi->height*mux_v->bih->biBitCount/8, 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE); + muxer_write_chunk(mux_v, mpi->width*mpi->height*mux_v->bih->biBitCount/8, 0x10, pts, pts); return 1; } diff --git a/libmpcodecs/ve_vfw.c b/libmpcodecs/ve_vfw.c index b362908a89..6a272c5eeb 100644 --- a/libmpcodecs/ve_vfw.c +++ b/libmpcodecs/ve_vfw.c @@ -238,12 +238,12 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt){ return 0; } -static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ +static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ long flags=0; int ret; // flip_upside_down(vo_image_ptr,vo_image_ptr,3*vo_w,vo_h); // dirty hack ret=vfw_encode_frame(mux_v->bih, mux_v->buffer, vfw_bih, mpi->planes[0], &flags, 10000); - muxer_write_chunk(mux_v,mux_v->bih->biSizeImage,flags, MP_NOPTS_VALUE, MP_NOPTS_VALUE); + muxer_write_chunk(mux_v,mux_v->bih->biSizeImage,flags, pts, pts); return 1; } diff --git a/libmpcodecs/ve_x264.c b/libmpcodecs/ve_x264.c index ba03fa4374..c8ad1fdeca 100644 --- a/libmpcodecs/ve_x264.c +++ b/libmpcodecs/ve_x264.c @@ -221,7 +221,7 @@ static int parse_cqm(const char *str, uint8_t *cqm, int length, return 0; } -static int put_image(struct vf_instance_s *vf, mp_image_t *mpi); +static int put_image(struct vf_instance_s *vf, mp_image_t *mpi, double pts); static int encode_frame(struct vf_instance_s *vf, x264_picture_t *pic_in); static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) { @@ -474,7 +474,7 @@ static int query_format(struct vf_instance_s* vf, unsigned int fmt) return 0; } -static int put_image(struct vf_instance_s *vf, mp_image_t *mpi) +static int put_image(struct vf_instance_s *vf, mp_image_t *mpi, double pts) { h264_module_t *mod=(h264_module_t*)vf->priv; int i; diff --git a/libmpcodecs/ve_xvid.c b/libmpcodecs/ve_xvid.c index 881d9508a5..cf2016c73a 100644 --- a/libmpcodecs/ve_xvid.c +++ b/libmpcodecs/ve_xvid.c @@ -434,7 +434,7 @@ query_format(struct vf_instance_s* vf, unsigned int fmt) } static int -put_image(struct vf_instance_s* vf, mp_image_t *mpi) +put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) { XVID_ENC_STATS enc_stats; struct vf_priv_s *fp = vf->priv; diff --git a/libmpcodecs/ve_xvid4.c b/libmpcodecs/ve_xvid4.c index cde7dbc75f..b0a5ddfd8f 100644 --- a/libmpcodecs/ve_xvid4.c +++ b/libmpcodecs/ve_xvid4.c @@ -591,7 +591,7 @@ query_format(struct vf_instance_s* vf, unsigned int fmt) *==========================================================================*/ static int -put_image(struct vf_instance_s* vf, mp_image_t *mpi) +put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) { int size; xvid_enc_stats_t stats; diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index c436547c46..f7fb37ba76 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -630,8 +630,8 @@ int vf_next_query_format(struct vf_instance_s* vf, unsigned int fmt){ return flags; } -int vf_next_put_image(struct vf_instance_s* vf,mp_image_t *mpi){ - return vf->next->put_image(vf->next,mpi); +int vf_next_put_image(struct vf_instance_s* vf,mp_image_t *mpi, double pts){ + return vf->next->put_image(vf->next,mpi, pts); } void vf_next_draw_slice(struct vf_instance_s* vf,unsigned char** src, int * stride,int w, int h, int x, int y){ diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h index 00a6cf2166..32a44d286b 100644 --- a/libmpcodecs/vf.h +++ b/libmpcodecs/vf.h @@ -37,7 +37,7 @@ typedef struct vf_instance_s { void (*get_image)(struct vf_instance_s* vf, mp_image_t *mpi); int (*put_image)(struct vf_instance_s* vf, - mp_image_t *mpi); + mp_image_t *mpi, double pts); void (*start_slice)(struct vf_instance_s* vf, mp_image_t *mpi); void (*draw_slice)(struct vf_instance_s* vf, @@ -78,6 +78,10 @@ typedef struct vf_seteq_s #include "vfcap.h" +//FIXME this should be in a common header, but i dunno which +#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly + + // functions: void vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h); mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h); @@ -96,7 +100,7 @@ int vf_next_config(struct vf_instance_s* vf, unsigned int flags, unsigned int outfmt); int vf_next_control(struct vf_instance_s* vf, int request, void* data); int vf_next_query_format(struct vf_instance_s* vf, unsigned int fmt); -int vf_next_put_image(struct vf_instance_s* vf,mp_image_t *mpi); +int vf_next_put_image(struct vf_instance_s* vf,mp_image_t *mpi, double pts); void vf_next_draw_slice (struct vf_instance_s* vf, unsigned char** src, int* stride, int w,int h, int x, int y); vf_instance_t* append_filters(vf_instance_t* last); |