annotate libmpcodecs/ve_lavc.c @ 6110:7bea806b9c5f

Improvment for spu subtitles. Removed the integreted spudec in vobsub. Various cleanup/bugfix in vobsub (no more auto palette when a true one is here) HW spu rendering moved in spudec because we first need to reassable the packet before sending them to the hw. Spudec is now created only if nedded.
author albeu
date Fri, 17 May 2002 23:47:27 +0000
parents e8f6f477aad0
children ea6b20e70ac5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
1 #include <stdio.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
2 #include <stdlib.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
3 #include <string.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
4
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
5 #include "../config.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
6
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
7 #ifdef USE_LIBAVCODEC
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
8
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
9 #include "../mp_msg.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
10 #include "../help_mp.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
11
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
12 #include "codec-cfg.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
13 #include "stream.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
14 #include "demuxer.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
15 #include "stheader.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
16
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
17 #include "aviwrite.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
18
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
19 #include "img_format.h"
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
20 #include "mp_image.h"
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
21 #include "vf.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
22
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
23 #include "divx4_vbr.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
24
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
25 extern int pass;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
26 extern char* passtmpfile;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
27
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
28 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
29
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
30 #ifdef USE_LIBAVCODEC_SO
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
31 #include <libffmpeg/avcodec.h>
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
32 #else
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
33 #include "libavcodec/avcodec.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
34 #endif
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
35
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
36 #if LIBAVCODEC_BUILD < 4601
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
37 #error your version of libavcodec is too old, get a newer one, and dont send a bugreport, THIS IS NO BUG
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
38 #endif
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
39
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
40 extern int avcodec_inited;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
41
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
42 /* video options */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
43 static char *lavc_param_vcodec = NULL;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
44 static int lavc_param_vbitrate = -1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
45 static int lavc_param_vrate_tolerance = 1024*8;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
46 static int lavc_param_vhq = 0; /* default is realtime encoding */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
47 static int lavc_param_v4mv = 0;
5556
4016b44a1230 vme default changed 3->4
arpi
parents: 5551
diff changeset
48 static int lavc_param_vme = 4;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
49 static int lavc_param_vqscale = 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
50 static int lavc_param_vqmin = 3;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
51 static int lavc_param_vqmax = 15;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
52 static int lavc_param_vqdiff = 3;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
53 static float lavc_param_vqcompress = 0.5;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
54 static float lavc_param_vqblur = 0.5;
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
55 static float lavc_param_vb_qfactor = 2.0;
5657
ee2efbf3dc9d Preliminary support for lavcs b-frame encoding, disabled by default.
atmos4
parents: 5646
diff changeset
56 static int lavc_param_vmax_b_frames = 0;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
57 static int lavc_param_keyint = -1;
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
58 static int lavc_param_vpass = 0;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
59 static int lavc_param_vrc_strategy = 2;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
60 static int lavc_param_vb_strategy = 0;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
61
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
62 #include "cfgparser.h"
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
63
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
64 #ifdef USE_LIBAVCODEC
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
65 struct config lavcopts_conf[]={
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
66 {"vcodec", &lavc_param_vcodec, CONF_TYPE_STRING, 0, 0, 0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
67 {"vbitrate", &lavc_param_vbitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
68 {"vratetol", &lavc_param_vrate_tolerance, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
69 {"vhq", &lavc_param_vhq, CONF_TYPE_FLAG, 0, 0, 1, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
70 {"v4mv", &lavc_param_v4mv, CONF_TYPE_FLAG, 0, 0, 1, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
71 {"vme", &lavc_param_vme, CONF_TYPE_INT, CONF_RANGE, 0, 5, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
72 {"vqscale", &lavc_param_vqscale, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
73 {"vqmin", &lavc_param_vqmin, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
74 {"vqmax", &lavc_param_vqmax, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
75 {"vqdiff", &lavc_param_vqdiff, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
76 {"vqcomp", &lavc_param_vqcompress, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
77 {"vqblur", &lavc_param_vqblur, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL},
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
78 {"vb_qfactor", &lavc_param_vb_qfactor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 31.0, NULL},
5657
ee2efbf3dc9d Preliminary support for lavcs b-frame encoding, disabled by default.
atmos4
parents: 5646
diff changeset
79 {"vmax_b_frames", &lavc_param_vmax_b_frames, CONF_TYPE_INT, CONF_RANGE, 0, FF_MAX_B_FRAMES, NULL},
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
80 {"vpass", &lavc_param_vpass, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL},
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
81 {"vrc_strategy", &lavc_param_vrc_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL},
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
82 {"vb_strategy", &lavc_param_vb_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 1, NULL},
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
83 {"keyint", &lavc_param_keyint, CONF_TYPE_INT, 0, 0, 0, NULL},
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
84 {NULL, NULL, 0, 0, 0, 0, NULL}
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
85 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
86 #endif
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
87
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
88 struct vf_priv_s {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
89 aviwrite_stream_t* mux;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
90 AVCodecContext context;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
91 AVCodec *codec;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
92 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
93
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
94 #define mux_v (vf->priv->mux)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
95 #define lavc_venc_context (vf->priv->context)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
96
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
97 static int config(struct vf_instance_s* vf,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
98 int width, int height, int d_width, int d_height,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
99 unsigned int flags, unsigned int outfmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
100
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
101 mux_v->bih->biWidth=width;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
102 mux_v->bih->biHeight=height;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
103 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
104
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
105 memset(&lavc_venc_context, 0, sizeof(lavc_venc_context));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
106
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
107 printf("videocodec: libavcodec (%dx%d fourcc=%x [%.4s])\n",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
108 mux_v->bih->biWidth, mux_v->bih->biHeight, mux_v->bih->biCompression,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
109 (char *)&mux_v->bih->biCompression);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
110
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
111 lavc_venc_context.width = width;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
112 lavc_venc_context.height = height;
5677
a21cab74cde8 bitrate>16000 means bits not kbits - noticed by George Hawkins <george_hawkins@yahoo.com>
arpi
parents: 5657
diff changeset
113 if (lavc_param_vbitrate > 16000) /* != -1 */
a21cab74cde8 bitrate>16000 means bits not kbits - noticed by George Hawkins <george_hawkins@yahoo.com>
arpi
parents: 5657
diff changeset
114 lavc_venc_context.bit_rate = lavc_param_vbitrate;
a21cab74cde8 bitrate>16000 means bits not kbits - noticed by George Hawkins <george_hawkins@yahoo.com>
arpi
parents: 5657
diff changeset
115 else if (lavc_param_vbitrate >= 0) /* != -1 */
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
116 lavc_venc_context.bit_rate = lavc_param_vbitrate*1000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
117 else
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
118 lavc_venc_context.bit_rate = 800000; /* default */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
119 lavc_venc_context.bit_rate_tolerance= lavc_param_vrate_tolerance*1000;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
120 lavc_venc_context.frame_rate = (float)mux_v->h.dwRate/mux_v->h.dwScale * FRAME_RATE_BASE;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
121 lavc_venc_context.qmin= lavc_param_vqmin;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
122 lavc_venc_context.qmax= lavc_param_vqmax;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
123 lavc_venc_context.max_qdiff= lavc_param_vqdiff;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
124 lavc_venc_context.qcompress= lavc_param_vqcompress;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
125 lavc_venc_context.qblur= lavc_param_vqblur;
5657
ee2efbf3dc9d Preliminary support for lavcs b-frame encoding, disabled by default.
atmos4
parents: 5646
diff changeset
126 lavc_venc_context.max_b_frames= lavc_param_vmax_b_frames;
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
127 lavc_venc_context.b_quant_factor= lavc_param_vb_qfactor;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
128 lavc_venc_context.rc_strategy= lavc_param_vrc_strategy;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
129 lavc_venc_context.b_frame_strategy= lavc_param_vb_strategy;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
130
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
131 /* keyframe interval */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
132 if (lavc_param_keyint >= 0) /* != -1 */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
133 lavc_venc_context.gop_size = lavc_param_keyint;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
134 else
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
135 lavc_venc_context.gop_size = 250; /* default */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
136
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
137 if (lavc_param_vhq)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
138 {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
139 printf("High quality encoding selected (non real time)!\n");
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
140 lavc_venc_context.flags = CODEC_FLAG_HQ;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
141 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
142 else
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
143 lavc_venc_context.flags = 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
144
5781
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
145 /* 4mv is currently buggy with B frames */
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
146 if (lavc_param_vmax_b_frames > 0 && lavc_param_v4mv) {
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
147 printf("4MV with B-Frames not yet supported -> 4MV disabled\n");
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
148 lavc_param_v4mv = 0;
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
149 }
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
150
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
151 lavc_venc_context.flags|= lavc_param_v4mv ? CODEC_FLAG_4MV : 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
152
5778
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
153 /* lavc internal 2pass bitrate control */
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
154 if(lavc_param_vpass==1)
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
155 lavc_venc_context.flags|= CODEC_FLAG_PASS1;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
156 else if(lavc_param_vpass==2)
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
157 lavc_venc_context.flags|= CODEC_FLAG_PASS2;
f2586f1a3a96 support for new stuff (lavc internal 2pass, ...)
michael
parents: 5677
diff changeset
158
5624
d9af91d38449 workaround Juanjo's stupid vme change
arpi
parents: 5607
diff changeset
159 #ifdef ME_ZERO
d9af91d38449 workaround Juanjo's stupid vme change
arpi
parents: 5607
diff changeset
160 // workaround Juanjo's stupid incompatible change:
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
161 motion_estimation_method = lavc_param_vme;
5624
d9af91d38449 workaround Juanjo's stupid vme change
arpi
parents: 5607
diff changeset
162 #else
d9af91d38449 workaround Juanjo's stupid vme change
arpi
parents: 5607
diff changeset
163 lavc_venc_context.me_method = ME_ZERO+lavc_param_vme;
d9af91d38449 workaround Juanjo's stupid vme change
arpi
parents: 5607
diff changeset
164 #endif
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
165
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
166 /* fixed qscale :p */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
167 if (lavc_param_vqscale)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
168 {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
169 printf("Using constant qscale = %d (VBR)\n", lavc_param_vqscale);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
170 lavc_venc_context.flags |= CODEC_FLAG_QSCALE;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
171 lavc_venc_context.quality = lavc_param_vqscale;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
172 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
173
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
174 switch(pass){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
175 case 1:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
176 if (VbrControl_init_2pass_vbr_analysis(passtmpfile, 5) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
177 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
178 pass=0;
5781
62e9e0c0bd6a hq mode in first pass should work (as bad, ehh as well as LQ)
michael
parents: 5778
diff changeset
179 }
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
180 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
181 case 2:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
182 if (VbrControl_init_2pass_vbr_encoding(passtmpfile,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
183 lavc_venc_context.bit_rate,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
184 (float)mux_v->h.dwRate/mux_v->h.dwScale,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
185 100, /* crispness */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
186 5) == -1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
187 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
188 pass=0;
5632
93c9df5225a7 2-pass qscale fixed
arpi
parents: 5624
diff changeset
189 } else
93c9df5225a7 2-pass qscale fixed
arpi
parents: 5624
diff changeset
190 lavc_venc_context.flags|=CODEC_FLAG_QSCALE|CODEC_FLAG_TYPE; // VBR
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
191 break;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
192 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
193
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
194 if (avcodec_open(&lavc_venc_context, vf->priv->codec) != 0) {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
195 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantOpenCodec);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
196 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
197 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
198
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
199 if (lavc_venc_context.codec->encode == NULL) {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
200 mp_msg(MSGT_MENCODER,MSGL_ERR,"avcodec init failed (ctx->codec->encode == NULL)!\n");
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
201 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
202 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
203
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
204 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
205 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
206
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
207 static int control(struct vf_instance_s* vf, int request, void* data){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
208
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
209 return CONTROL_UNKNOWN;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
210 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
211
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
212 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
213 switch(fmt){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
214 case IMGFMT_YV12:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
215 case IMGFMT_IYUV:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
216 case IMGFMT_I420:
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5556
diff changeset
217 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
218 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
219 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
220 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
221
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
222 static void put_image(struct vf_instance_s* vf, mp_image_t *mpi){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
223 int out_size;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
224 AVPicture lavc_venc_picture;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
225
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
226 lavc_venc_picture.data[0]=mpi->planes[0];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
227 lavc_venc_picture.data[1]=mpi->planes[1];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
228 lavc_venc_picture.data[2]=mpi->planes[2];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
229 lavc_venc_picture.linesize[0]=mpi->stride[0];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
230 lavc_venc_picture.linesize[1]=mpi->stride[1];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
231 lavc_venc_picture.linesize[2]=mpi->stride[2];
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
232
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
233 if(pass==2){ // handle 2-pass:
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
234 lavc_venc_context.flags|=CODEC_FLAG_QSCALE; // enable VBR
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
235 lavc_venc_context.quality=VbrControl_get_quant();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
236 lavc_venc_context.key_frame=VbrControl_get_intra();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
237 lavc_venc_context.gop_size=0x3fffffff;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
238 out_size = avcodec_encode_video(&lavc_venc_context, mux_v->buffer, mux_v->buffer_size,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
239 &lavc_venc_picture);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
240 VbrControl_update_2pass_vbr_encoding(lavc_venc_context.mv_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
241 lavc_venc_context.i_tex_bits+lavc_venc_context.p_tex_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
242 8*out_size);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
243 } else {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
244 out_size = avcodec_encode_video(&lavc_venc_context, mux_v->buffer, mux_v->buffer_size,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
245 &lavc_venc_picture);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
246
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
247 if(pass==1){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
248 VbrControl_update_2pass_vbr_analysis(lavc_venc_context.key_frame,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
249 lavc_venc_context.mv_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
250 lavc_venc_context.i_tex_bits+lavc_venc_context.p_tex_bits,
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
251 8*out_size, lavc_venc_context.quality);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
252 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
253
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
254 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
255
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
256 mencoder_write_chunk(mux_v,out_size,lavc_venc_context.key_frame?0x10:0);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
257 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
258
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
259 static void uninit(struct vf_instance_s* vf){
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
260 avcodec_close(&lavc_venc_context);
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
261 }
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
262
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
263 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
264
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
265 static int vf_open(vf_instance_t *vf, char* args){
5551
73978162b6a1 soem fixes
arpi
parents: 5550
diff changeset
266 vf->uninit=uninit;
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
267 vf->config=config;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
268 vf->control=control;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
269 vf->query_format=query_format;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
270 vf->put_image=put_image;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
271 vf->priv=malloc(sizeof(struct vf_priv_s));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
272 memset(vf->priv,0,sizeof(struct vf_priv_s));
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
273 vf->priv->mux=args;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
274
5977
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
275 /* XXX: hack: some of the MJPEG decoder DLL's needs exported huffman
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
276 table, so we define a zero-table, also lavc mjpeg encoder is putting
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
277 huffman tables into the stream, so no problem */
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
278 if (lavc_param_vcodec && !strcasecmp(lavc_param_vcodec, "mjpeg"))
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
279 {
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
280 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+28);
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
281 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER)+28);
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
282 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+28;
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
283 }
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
284 else
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
285 {
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
286 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER));
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
287 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER));
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
288 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
289 }
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
290 mux_v->bih->biWidth=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
291 mux_v->bih->biHeight=0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
292 mux_v->bih->biPlanes=1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
293 mux_v->bih->biBitCount=24;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
294 if (!lavc_param_vcodec)
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
295 {
5977
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
296 printf("No libavcodec codec specified! It's required!\n");
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
297 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
298 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
299
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
300 if (!strcasecmp(lavc_param_vcodec, "mpeg1") || !strcasecmp(lavc_param_vcodec, "mpeg1video"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
301 mux_v->bih->biCompression = mmioFOURCC('m', 'p', 'g', '1');
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
302 else if (!strcasecmp(lavc_param_vcodec, "h263") || !strcasecmp(lavc_param_vcodec, "h263p"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
303 mux_v->bih->biCompression = mmioFOURCC('h', '2', '6', '3');
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
304 else if (!strcasecmp(lavc_param_vcodec, "rv10"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
305 mux_v->bih->biCompression = mmioFOURCC('R', 'V', '1', '0');
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
306 else if (!strcasecmp(lavc_param_vcodec, "mjpeg"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
307 mux_v->bih->biCompression = mmioFOURCC('M', 'J', 'P', 'G');
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
308 else if (!strcasecmp(lavc_param_vcodec, "mpeg4"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
309 mux_v->bih->biCompression = mmioFOURCC('D', 'I', 'V', 'X');
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
310 else if (!strcasecmp(lavc_param_vcodec, "msmpeg4"))
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
311 mux_v->bih->biCompression = mmioFOURCC('d', 'i', 'v', '3');
5972
80c25f6a535f msmpeg4v2 -> MP42 mapping, requested by Gabucino
alex
parents: 5781
diff changeset
312 else if (!strcasecmp(lavc_param_vcodec, "msmpeg4v2"))
80c25f6a535f msmpeg4v2 -> MP42 mapping, requested by Gabucino
alex
parents: 5781
diff changeset
313 mux_v->bih->biCompression = mmioFOURCC('M', 'P', '4', '2');
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
314 else
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
315 mux_v->bih->biCompression = mmioFOURCC(lavc_param_vcodec[0],
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
316 lavc_param_vcodec[1], lavc_param_vcodec[2], lavc_param_vcodec[3]); /* FIXME!!! */
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
317
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
318 if (!avcodec_inited){
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
319 avcodec_init();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
320 avcodec_register_all();
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
321 avcodec_inited=1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
322 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
323
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
324 vf->priv->codec = (AVCodec *)avcodec_find_encoder_by_name(lavc_param_vcodec);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
325 if (!vf->priv->codec) {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
326 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_MissingLAVCcodec, lavc_param_vcodec);
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
327 return 0;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
328 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
329
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
330 return 1;
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
331 }
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
332
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
333 vf_info_t ve_info_lavc = {
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
334 "libavcodec encoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
335 "lavc",
5977
e8f6f477aad0 a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents: 5972
diff changeset
336 "A'rpi and Alex",
5550
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
337 "for internal use by mencoder",
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
338 vf_open
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
339 };
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
340
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
341 //===========================================================================//
7d1dfb59c6c0 encoders
arpi
parents:
diff changeset
342 #endif