[MPlayer-dev-eng] [PATCH] encode duplicate frames in mencoder
D Richard Felker III
dalias at aerifal.cx
Tue Apr 27 20:02:42 CEST 2004
On Tue, Apr 27, 2004 at 01:56:46PM -0400, D Richard Felker III wrote:
> On Tue, Apr 27, 2004 at 01:34:27PM -0400, D Richard Felker III wrote:
> > This patch makes it possible to actually encode duplicate frames with
> > mencoder, rather than writing the stupid 0-byte avi chunks that cause
> > trouble (especially with -of mpeg!). Unfortunately it doesn't work
> > right now for B frames because it actually exploits a hack in lavc.
> > The same principle is possible without this hack, but it would take
> > extra time to copy a backup of the previous encoded frame.
>
> LOL, no wonder it works, I forgot to write the frame! I'll see if that
> fixes it...
Still doesn't. :) But here's the new patch.
Rich
-------------- next part --------------
Index: cfg-mencoder.h
===================================================================
RCS file: /cvsroot/mplayer/main/cfg-mencoder.h,v
retrieving revision 1.82
diff -u -r1.82 cfg-mencoder.h
--- cfg-mencoder.h 24 Mar 2004 15:16:36 -0000 1.82
+++ cfg-mencoder.h 27 Apr 2004 17:55:33 -0000
@@ -207,6 +207,9 @@
{"autoexpand", &auto_expand, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"noautoexpand", &auto_expand, CONF_TYPE_FLAG, 0, 1, 0, NULL},
+ {"encodedups", &encode_duplicates, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ {"noencodedups", &encode_duplicates, CONF_TYPE_FLAG, 0, 1, 0, NULL},
+
// info header strings
{"info", info_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
Index: mencoder.c
===================================================================
RCS file: /cvsroot/mplayer/main/mencoder.c,v
retrieving revision 1.241
diff -u -r1.241 mencoder.c
--- mencoder.c 17 Apr 2004 16:46:40 -0000 1.241
+++ mencoder.c 27 Apr 2004 17:55:34 -0000
@@ -189,6 +189,7 @@
#endif
int auto_expand=1;
+int encode_duplicates;
// infos are empty by default
char *info_name=NULL;
@@ -1312,7 +1313,8 @@
if(file_format != DEMUXER_TYPE_TV && !verbose) printf(MSGTR_DuplicateFrames,-skip_flag);
while(skip_flag<0){
duplicatedframes++;
- muxer_write_chunk(mux_v,0,0);
+ if (!encode_duplicates || vf_next_control(sh_video->vfilter, VFCTRL_DUPLICATE_FRAME, 0) != CONTROL_TRUE)
+ muxer_write_chunk(mux_v,0,0);
++skip_flag;
}
} else
Index: libmpcodecs/vf.h
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/vf.h,v
retrieving revision 1.21
diff -u -r1.21 vf.h
--- libmpcodecs/vf.h 20 May 2003 17:42:33 -0000 1.21
+++ libmpcodecs/vf.h 27 Apr 2004 17:55:34 -0000
@@ -64,6 +64,7 @@
#define VFCTRL_DRAW_OSD 7
#define VFCTRL_CHANGE_RECTANGLE 9 /* Change the rectangle boundaries */
#define VFCTRL_FLIP_PAGE 10 /* Tell the vo to flip pages */
+#define VFCTRL_DUPLICATE_FRAME 11 /* For encoding - encode zero-change frame */
#include "vfcap.h"
Index: libmpcodecs/ve_lavc.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/ve_lavc.c,v
retrieving revision 1.93
diff -u -r1.93 ve_lavc.c
--- libmpcodecs/ve_lavc.c 24 Mar 2004 15:16:36 -0000 1.93
+++ libmpcodecs/ve_lavc.c 27 Apr 2004 17:55:34 -0000
@@ -681,6 +681,24 @@
}
static int control(struct vf_instance_s* vf, int request, void* data){
+ AVFrame *pic= vf->priv->pic;
+ AVFrame *coded= vf->priv->context->coded_frame;
+ int out_size;
+ switch(request) {
+ case VFCTRL_DUPLICATE_FRAME:
+ if (!pic || !coded) break;
+ pic->data[0]=coded->data[0];
+ pic->data[1]=coded->data[1];
+ pic->data[2]=coded->data[2];
+ pic->linesize[0]=coded->linesize[0];
+ pic->linesize[1]=coded->linesize[1];
+ pic->linesize[2]=coded->linesize[2];
+
+ out_size = avcodec_encode_video(lavc_venc_context, mux_v->buffer, mux_v->buffer_size, pic);
+ if (out_size <= 0) break;
+ muxer_write_chunk(mux_v,out_size,lavc_venc_context->coded_frame->key_frame?0x10:0);
+ return CONTROL_TRUE;
+ }
return CONTROL_UNKNOWN;
}
More information about the MPlayer-dev-eng
mailing list