Mercurial > mplayer.hg
annotate libmpcodecs/ve_lavc.c @ 22616:09dc129234a0
Matroska seeking fixes
If a relative seek forward went past the last index position the
Matroska demuxer did not seek to any index position. It did however set
the mkv_d->skip_to_timecode variable which meant that the next
fill_buffer() call would read from the current position until the target
position (probably the end of the file). Fix this by changing the code
to seek to the last index position if that is between the current and
target positions.
Also change backwards relative seek to accept an exactly matching index
position (<= vs <) and reorganize the seeking conditionals to allow
making the above change without turning the code into a complete mess.
author | uau |
---|---|
date | Fri, 16 Mar 2007 14:55:41 +0000 |
parents | ed8f90096c65 |
children | c8908f1c609f |
rev | line source |
---|---|
5550 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
8237 | 4 #include <math.h> |
17469
40b109500177
Using INT_MAX without including limits.h breaks compilation on MinGW.
diego
parents:
17464
diff
changeset
|
5 #include <limits.h> |
8347 | 6 #include <time.h> |
17909 | 7 #include <assert.h> |
5550 | 8 |
8371
345a539683da
infinity fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
8347
diff
changeset
|
9 #if !defined(INFINITY) && defined(HUGE_VAL) |
345a539683da
infinity fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
8347
diff
changeset
|
10 #define INFINITY HUGE_VAL |
345a539683da
infinity fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
8347
diff
changeset
|
11 #endif |
345a539683da
infinity fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
8347
diff
changeset
|
12 |
17012 | 13 #include "config.h" |
5550 | 14 |
17012 | 15 #include "mp_msg.h" |
16 #include "help_mp.h" | |
5550 | 17 |
18 #include "codec-cfg.h" | |
22600
3c2b4a866c6a
Add explicit location for headers from the stream/ directory.
diego
parents:
22152
diff
changeset
|
19 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
20 #include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
21 #include "libmpdemux/stheader.h" |
5550 | 22 |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22600
diff
changeset
|
23 #include "libmpdemux/muxer.h" |
5550 | 24 |
5607 | 25 #include "img_format.h" |
26 #include "mp_image.h" | |
5550 | 27 #include "vf.h" |
28 | |
7090
43d7b60bd7f4
fixing compilation without divx4 patch by (Rmi Guyomarch <rguyom at pobox dot com>)
michael
parents:
7089
diff
changeset
|
29 extern char* passtmpfile; |
5550 | 30 |
31 //===========================================================================// | |
32 | |
33 #ifdef USE_LIBAVCODEC_SO | |
7004 | 34 #include <ffmpeg/avcodec.h> |
5550 | 35 #else |
36 #include "libavcodec/avcodec.h" | |
37 #endif | |
38 | |
39 extern int avcodec_inited; | |
40 | |
41 /* video options */ | |
7555 | 42 static char *lavc_param_vcodec = "mpeg4"; |
5550 | 43 static int lavc_param_vbitrate = -1; |
7088 | 44 static int lavc_param_vrate_tolerance = 1000*8; |
10498 | 45 static int lavc_param_mb_decision = 0; /* default is realtime encoding */ |
5550 | 46 static int lavc_param_v4mv = 0; |
5556 | 47 static int lavc_param_vme = 4; |
18569 | 48 static float lavc_param_vqscale = -1; |
7088 | 49 static int lavc_param_vqmin = 2; |
50 static int lavc_param_vqmax = 31; | |
8492 | 51 static int lavc_param_mb_qmin = 2; |
52 static int lavc_param_mb_qmax = 31; | |
11032 | 53 static float lavc_param_lmin = 2; |
54 static float lavc_param_lmax = 31; | |
20756 | 55 static float lavc_param_mb_lmin = 2; |
56 static float lavc_param_mb_lmax = 31; | |
5550 | 57 static int lavc_param_vqdiff = 3; |
58 static float lavc_param_vqcompress = 0.5; | |
59 static float lavc_param_vqblur = 0.5; | |
7088 | 60 static float lavc_param_vb_qfactor = 1.25; |
61 static float lavc_param_vb_qoffset = 1.25; | |
62 static float lavc_param_vi_qfactor = 0.8; | |
63 static float lavc_param_vi_qoffset = 0.0; | |
5657
ee2efbf3dc9d
Preliminary support for lavcs b-frame encoding, disabled by default.
atmos4
parents:
5646
diff
changeset
|
64 static int lavc_param_vmax_b_frames = 0; |
5550 | 65 static int lavc_param_keyint = -1; |
5778 | 66 static int lavc_param_vpass = 0; |
17886
d526e19c56c3
Support libavcodec vrc_strategy=1 (XviD ratecontrol).
corey
parents:
17842
diff
changeset
|
67 static int lavc_param_vrc_strategy = 0; |
5778 | 68 static int lavc_param_vb_strategy = 0; |
6255
140e94c4c89b
single coefficient elimination disabled by default
michael
parents:
6228
diff
changeset
|
69 static int lavc_param_luma_elim_threshold = 0; |
140e94c4c89b
single coefficient elimination disabled by default
michael
parents:
6228
diff
changeset
|
70 static int lavc_param_chroma_elim_threshold = 0; |
6228
ea6b20e70ac5
new options to support Michael's libavcodec patch, #ifdefed
arpi
parents:
5977
diff
changeset
|
71 static int lavc_param_packet_size= 0; |
15385
6e455aec9cca
vstrict=-1 is now less "dangerous", make it default and remove m/ljpeg encoding colorspace hack
reimar
parents:
15368
diff
changeset
|
72 static int lavc_param_strict= -1; |
6228
ea6b20e70ac5
new options to support Michael's libavcodec patch, #ifdefed
arpi
parents:
5977
diff
changeset
|
73 static int lavc_param_data_partitioning= 0; |
6461 | 74 static int lavc_param_gray=0; |
7088 | 75 static float lavc_param_rc_qsquish=1.0; |
76 static float lavc_param_rc_qmod_amp=0; | |
77 static int lavc_param_rc_qmod_freq=0; | |
78 static char *lavc_param_rc_override_string=NULL; | |
79 static char *lavc_param_rc_eq="tex^qComp"; | |
80 static int lavc_param_rc_buffer_size=0; | |
81 static float lavc_param_rc_buffer_aggressivity=1.0; | |
82 static int lavc_param_rc_max_rate=0; | |
83 static int lavc_param_rc_min_rate=0; | |
84 static float lavc_param_rc_initial_cplx=0; | |
15988 | 85 static float lavc_param_rc_initial_buffer_occupancy=0.9; |
6944 | 86 static int lavc_param_mpeg_quant=0; |
7152 | 87 static int lavc_param_fdct=0; |
7564 | 88 static int lavc_param_idct=0; |
8237 | 89 static char* lavc_param_aspect = NULL; |
9993
6e7f3643bee6
optional automatic aspect encoding based on d_width and d_height
rfelker
parents:
9868
diff
changeset
|
90 static int lavc_param_autoaspect = 0; |
7490 | 91 static float lavc_param_lumi_masking= 0.0; |
7496 | 92 static float lavc_param_dark_masking= 0.0; |
7490 | 93 static float lavc_param_temporal_cplx_masking= 0.0; |
94 static float lavc_param_spatial_cplx_masking= 0.0; | |
95 static float lavc_param_p_masking= 0.0; | |
15368 | 96 static float lavc_param_border_masking= 0.0; |
7490 | 97 static int lavc_param_normalize_aqp= 0; |
7504 | 98 static int lavc_param_interlaced_dct= 0; |
8190 | 99 static int lavc_param_prediction_method= FF_PRED_LEFT; |
10778 | 100 static int lavc_param_format= IMGFMT_YV12; |
8341 | 101 static int lavc_param_debug= 0; |
8347 | 102 static int lavc_param_psnr= 0; |
8803 | 103 static int lavc_param_me_pre_cmp= 0; |
8587 | 104 static int lavc_param_me_cmp= 0; |
105 static int lavc_param_me_sub_cmp= 0; | |
106 static int lavc_param_mb_cmp= 0; | |
11753 | 107 #ifdef FF_CMP_VSAD |
108 static int lavc_param_ildct_cmp= FF_CMP_VSAD; | |
109 #endif | |
8803 | 110 static int lavc_param_pre_dia_size= 0; |
8587 | 111 static int lavc_param_dia_size= 0; |
112 static int lavc_param_qpel= 0; | |
8684 | 113 static int lavc_param_trell= 0; |
11930
f2a503cb70ba
bit_exact patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
11910
diff
changeset
|
114 static int lavc_param_bit_exact = 0; |
9536 | 115 static int lavc_param_aic= 0; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
116 static int lavc_param_aiv= 0; |
9536 | 117 static int lavc_param_umv= 0; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
118 static int lavc_param_obmc= 0; |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
119 static int lavc_param_loop= 0; |
8695 | 120 static int lavc_param_last_pred= 0; |
8709 | 121 static int lavc_param_pre_me= 1; |
8803 | 122 static int lavc_param_me_subpel_quality= 8; |
9508 | 123 static int lavc_param_me_range= 0; |
9645 | 124 static int lavc_param_ibias= FF_DEFAULT_QUANT_BIAS; |
125 static int lavc_param_pbias= FF_DEFAULT_QUANT_BIAS; | |
10291 | 126 static int lavc_param_coder= 0; |
127 static int lavc_param_context= 0; | |
10779 | 128 static char *lavc_param_intra_matrix = NULL; |
129 static char *lavc_param_inter_matrix = NULL; | |
10963 | 130 static int lavc_param_cbp= 0; |
10974 | 131 static int lavc_param_mv0= 0; |
11363 | 132 static int lavc_param_noise_reduction= 0; |
11910 | 133 static int lavc_param_qns= 0; |
11445 | 134 static int lavc_param_qp_rd= 0; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
135 static int lavc_param_inter_threshold= 0; |
11699
9165fbc7d89d
scenechange_threshold command line option patch by (Balatoni Denes <pnis at coder dot hu>)
michael
parents:
11672
diff
changeset
|
136 static int lavc_param_sc_threshold= 0; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
137 static int lavc_param_ss= 0; |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
138 static int lavc_param_top= -1; |
11702 | 139 static int lavc_param_alt= 0; |
140 static int lavc_param_ilme= 0; | |
12542 | 141 static int lavc_param_nssew= 8; |
12764
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
142 static int lavc_param_closed_gop = 0; |
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
143 static int lavc_param_dc_precision = 8; |
12760
787a1ce375df
multi-threaded lavc patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
12542
diff
changeset
|
144 static int lavc_param_threads= 1; |
13386
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
145 static int lavc_param_turbo = 0; |
17243
67ce2e4206ea
support downscaling frames for dynamic b frame decission
gpoirier
parents:
17063
diff
changeset
|
146 static int lavc_param_brd_scale = 0; |
17256
b89745a920d6
Add bidir_refine to lavc's set of options, and document it.
gpoirier
parents:
17243
diff
changeset
|
147 static int lavc_param_bidir_refine = 0; |
17464 | 148 static int lavc_param_sc_factor = 1; |
17478
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
149 static int lavc_param_video_global_header= 0; |
18489 | 150 static int lavc_param_mv0_threshold = 256; |
18569 | 151 static int lavc_param_refs = 1; |
18572 | 152 static int lavc_param_b_sensitivity = 40; |
5550 | 153 |
11375 | 154 char *lavc_param_acodec = "mp2"; |
155 int lavc_param_atag = 0; | |
156 int lavc_param_abitrate = 224; | |
17842 | 157 int lavc_param_audio_global_header= 0; |
11375 | 158 |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
10498
diff
changeset
|
159 #include "m_option.h" |
5550 | 160 |
161 #ifdef USE_LIBAVCODEC | |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
10498
diff
changeset
|
162 m_option_t lavcopts_conf[]={ |
11375 | 163 {"acodec", &lavc_param_acodec, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
164 {"abitrate", &lavc_param_abitrate, CONF_TYPE_INT, CONF_RANGE, 1, 1000, NULL}, | |
165 {"atag", &lavc_param_atag, CONF_TYPE_INT, CONF_RANGE, 0, 0xffff, NULL}, | |
5550 | 166 {"vcodec", &lavc_param_vcodec, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
167 {"vbitrate", &lavc_param_vbitrate, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, | |
168 {"vratetol", &lavc_param_vrate_tolerance, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, | |
10498 | 169 {"vhq", &lavc_param_mb_decision, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
170 {"mbd", &lavc_param_mb_decision, CONF_TYPE_INT, CONF_RANGE, 0, 9, NULL}, | |
5550 | 171 {"v4mv", &lavc_param_v4mv, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
17261 | 172 {"vme", &lavc_param_vme, CONF_TYPE_INT, CONF_RANGE, 0, 8, NULL}, |
18569 | 173 {"vqscale", &lavc_param_vqscale, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 255.0, NULL}, |
5550 | 174 {"vqmin", &lavc_param_vqmin, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, |
175 {"vqmax", &lavc_param_vqmax, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
8492 | 176 {"mbqmin", &lavc_param_mb_qmin, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, |
177 {"mbqmax", &lavc_param_mb_qmax, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, | |
11032 | 178 {"lmin", &lavc_param_lmin, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, |
179 {"lmax", &lavc_param_lmax, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, | |
20756 | 180 {"mblmin", &lavc_param_mb_lmin, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, |
181 {"mblmax", &lavc_param_mb_lmax, CONF_TYPE_FLOAT, CONF_RANGE, 0.01, 255.0, NULL}, | |
5550 | 182 {"vqdiff", &lavc_param_vqdiff, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, |
183 {"vqcomp", &lavc_param_vqcompress, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, | |
184 {"vqblur", &lavc_param_vqblur, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, | |
7088 | 185 {"vb_qfactor", &lavc_param_vb_qfactor, CONF_TYPE_FLOAT, CONF_RANGE, -31.0, 31.0, NULL}, |
5657
ee2efbf3dc9d
Preliminary support for lavcs b-frame encoding, disabled by default.
atmos4
parents:
5646
diff
changeset
|
186 {"vmax_b_frames", &lavc_param_vmax_b_frames, CONF_TYPE_INT, CONF_RANGE, 0, FF_MAX_B_FRAMES, NULL}, |
13385
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
187 {"vpass", &lavc_param_vpass, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL}, |
5778 | 188 {"vrc_strategy", &lavc_param_vrc_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL}, |
8413 | 189 {"vb_strategy", &lavc_param_vb_strategy, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, |
6228
ea6b20e70ac5
new options to support Michael's libavcodec patch, #ifdefed
arpi
parents:
5977
diff
changeset
|
190 {"vb_qoffset", &lavc_param_vb_qoffset, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 31.0, NULL}, |
7039
2eae7ac0fa8b
same behavior for luma & chroma single coeff elimination
michael
parents:
7038
diff
changeset
|
191 {"vlelim", &lavc_param_luma_elim_threshold, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, |
7038 | 192 {"vcelim", &lavc_param_chroma_elim_threshold, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, |
6228
ea6b20e70ac5
new options to support Michael's libavcodec patch, #ifdefed
arpi
parents:
5977
diff
changeset
|
193 {"vpsize", &lavc_param_packet_size, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, |
8195 | 194 {"vstrict", &lavc_param_strict, CONF_TYPE_INT, CONF_RANGE, -99, 99, NULL}, |
6228
ea6b20e70ac5
new options to support Michael's libavcodec patch, #ifdefed
arpi
parents:
5977
diff
changeset
|
195 {"vdpart", &lavc_param_data_partitioning, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, |
5550 | 196 {"keyint", &lavc_param_keyint, CONF_TYPE_INT, 0, 0, 0, NULL}, |
6461 | 197 {"gray", &lavc_param_gray, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, |
6944 | 198 {"mpeg_quant", &lavc_param_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
7088 | 199 {"vi_qfactor", &lavc_param_vi_qfactor, CONF_TYPE_FLOAT, CONF_RANGE, -31.0, 31.0, NULL}, |
200 {"vi_qoffset", &lavc_param_vi_qoffset, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 31.0, NULL}, | |
201 {"vqsquish", &lavc_param_rc_qsquish, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, | |
202 {"vqmod_amp", &lavc_param_rc_qmod_amp, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, | |
203 {"vqmod_freq", &lavc_param_rc_qmod_freq, CONF_TYPE_INT, 0, 0, 0, NULL}, | |
204 {"vrc_eq", &lavc_param_rc_eq, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
205 {"vrc_override", &lavc_param_rc_override_string, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
17063
8f1dafb105df
Fixed wrong M_OPT_RANGE in vrc_maxrate/vrc_minrate , default was 0 and range [4,2400000]
reynaldo
parents:
17012
diff
changeset
|
206 {"vrc_maxrate", &lavc_param_rc_max_rate, CONF_TYPE_INT, CONF_RANGE, 0, 24000000, NULL}, |
8f1dafb105df
Fixed wrong M_OPT_RANGE in vrc_maxrate/vrc_minrate , default was 0 and range [4,2400000]
reynaldo
parents:
17012
diff
changeset
|
207 {"vrc_minrate", &lavc_param_rc_min_rate, CONF_TYPE_INT, CONF_RANGE, 0, 24000000, NULL}, |
11245
9a3230a5ef38
100l patch by (Tilmann Bitterberg <transcode at tibit dot org>)
michael
parents:
11195
diff
changeset
|
208 {"vrc_buf_size", &lavc_param_rc_buffer_size, CONF_TYPE_INT, CONF_RANGE, 4, 24000000, NULL}, |
7088 | 209 {"vrc_buf_aggressivity", &lavc_param_rc_buffer_aggressivity, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 99.0, NULL}, |
210 {"vrc_init_cplx", &lavc_param_rc_initial_cplx, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 9999999.0, NULL}, | |
15781 | 211 {"vrc_init_occupancy", &lavc_param_rc_initial_buffer_occupancy, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, |
7152 | 212 {"vfdct", &lavc_param_fdct, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, |
8237 | 213 {"aspect", &lavc_param_aspect, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
9993
6e7f3643bee6
optional automatic aspect encoding based on d_width and d_height
rfelker
parents:
9868
diff
changeset
|
214 {"autoaspect", &lavc_param_autoaspect, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
7490 | 215 {"lumi_mask", &lavc_param_lumi_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, |
216 {"tcplx_mask", &lavc_param_temporal_cplx_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, | |
217 {"scplx_mask", &lavc_param_spatial_cplx_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, | |
218 {"p_mask", &lavc_param_p_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, | |
219 {"naq", &lavc_param_normalize_aqp, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
7496 | 220 {"dark_mask", &lavc_param_dark_masking, CONF_TYPE_FLOAT, CONF_RANGE, -1.0, 1.0, NULL}, |
7504 | 221 {"ildct", &lavc_param_interlaced_dct, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
7564 | 222 {"idct", &lavc_param_idct, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, |
8190 | 223 {"pred", &lavc_param_prediction_method, CONF_TYPE_INT, CONF_RANGE, 0, 20, NULL}, |
10778 | 224 {"format", &lavc_param_format, CONF_TYPE_IMGFMT, 0, 0, 0, NULL}, |
8341 | 225 {"debug", &lavc_param_debug, CONF_TYPE_INT, CONF_RANGE, 0, 100000000, NULL}, |
8347 | 226 {"psnr", &lavc_param_psnr, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PSNR, NULL}, |
8803 | 227 {"precmp", &lavc_param_me_pre_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, |
8587 | 228 {"cmp", &lavc_param_me_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, |
229 {"subcmp", &lavc_param_me_sub_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, | |
230 {"mbcmp", &lavc_param_mb_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, | |
11753 | 231 #ifdef FF_CMP_VSAD |
232 {"ildctcmp", &lavc_param_ildct_cmp, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, | |
233 #endif | |
11930
f2a503cb70ba
bit_exact patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
11910
diff
changeset
|
234 {"bit_exact", &lavc_param_bit_exact, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_BITEXACT, NULL}, |
8803 | 235 {"predia", &lavc_param_pre_dia_size, CONF_TYPE_INT, CONF_RANGE, -2000, 2000, NULL}, |
8684 | 236 {"dia", &lavc_param_dia_size, CONF_TYPE_INT, CONF_RANGE, -2000, 2000, NULL}, |
8587 | 237 {"qpel", &lavc_param_qpel, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL, NULL}, |
8684 | 238 {"trell", &lavc_param_trell, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRELLIS_QUANT, NULL}, |
8695 | 239 {"last_pred", &lavc_param_last_pred, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, |
8709 | 240 {"preme", &lavc_param_pre_me, CONF_TYPE_INT, CONF_RANGE, 0, 2000, NULL}, |
8803 | 241 {"subq", &lavc_param_me_subpel_quality, CONF_TYPE_INT, CONF_RANGE, 0, 8, NULL}, |
9508 | 242 {"me_range", &lavc_param_me_range, CONF_TYPE_INT, CONF_RANGE, 0, 16000, NULL}, |
9536 | 243 #ifdef CODEC_FLAG_H263P_AIC |
244 {"aic", &lavc_param_aic, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIC, NULL}, | |
245 {"umv", &lavc_param_umv, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_UMV, NULL}, | |
246 #endif | |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
247 #ifdef CODEC_FLAG_H263P_AIV |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
248 {"aiv", &lavc_param_aiv, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIV, NULL}, |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
249 #endif |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
250 #ifdef CODEC_FLAG_OBMC |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
251 {"obmc", &lavc_param_obmc, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_OBMC, NULL}, |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
252 #endif |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
253 #ifdef CODEC_FLAG_LOOP_FILTER |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
254 {"loop", &lavc_param_loop, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_LOOP_FILTER, NULL}, |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
255 #endif |
9645 | 256 {"ibias", &lavc_param_ibias, CONF_TYPE_INT, CONF_RANGE, -512, 512, NULL}, |
257 {"pbias", &lavc_param_pbias, CONF_TYPE_INT, CONF_RANGE, -512, 512, NULL}, | |
10291 | 258 {"coder", &lavc_param_coder, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, |
259 {"context", &lavc_param_context, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, | |
10779 | 260 {"intra_matrix", &lavc_param_intra_matrix, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
261 {"inter_matrix", &lavc_param_inter_matrix, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
10963 | 262 {"cbp", &lavc_param_cbp, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CBP_RD, NULL}, |
10974 | 263 {"mv0", &lavc_param_mv0, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0, NULL}, |
11363 | 264 {"nr", &lavc_param_noise_reduction, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, |
11445 | 265 #ifdef CODEC_FLAG_QP_RD |
266 {"qprd", &lavc_param_qp_rd, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QP_RD, NULL}, | |
267 #endif | |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
268 #ifdef CODEC_FLAG_H263P_SLICE_STRUCT |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
269 {"ss", &lavc_param_ss, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_SLICE_STRUCT, NULL}, |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
270 #endif |
11702 | 271 #ifdef CODEC_FLAG_ALT_SCAN |
272 {"alt", &lavc_param_alt, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_ALT_SCAN, NULL}, | |
273 #endif | |
274 #ifdef CODEC_FLAG_INTERLACED_ME | |
275 {"ilme", &lavc_param_ilme, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME, NULL}, | |
276 #endif | |
12764
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
277 #ifdef CODEC_FLAG_CLOSED_GOP |
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
278 {"cgop", &lavc_param_closed_gop, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CLOSED_GOP, NULL}, |
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
279 #endif |
12765 | 280 {"dc", &lavc_param_dc_precision, CONF_TYPE_INT, CONF_RANGE, 8, 11, NULL}, |
15368 | 281 {"border_mask", &lavc_param_border_masking, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL}, |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
282 {"inter_threshold", &lavc_param_inter_threshold, CONF_TYPE_INT, CONF_RANGE, -1000000, 1000000, NULL}, |
15989
a9eb721d92fc
10l: scene change detecion is deactivated with sc_threshold=1000000000
ranma
parents:
15988
diff
changeset
|
283 {"sc_threshold", &lavc_param_sc_threshold, CONF_TYPE_INT, CONF_RANGE, -1000000000, 1000000000, NULL}, |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
284 {"top", &lavc_param_top, CONF_TYPE_INT, CONF_RANGE, -1, 1, NULL}, |
11910 | 285 {"qns", &lavc_param_qns, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, |
12542 | 286 {"nssew", &lavc_param_nssew, CONF_TYPE_INT, CONF_RANGE, 0, 1000000, NULL}, |
12760
787a1ce375df
multi-threaded lavc patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
12542
diff
changeset
|
287 {"threads", &lavc_param_threads, CONF_TYPE_INT, CONF_RANGE, 1, 8, NULL}, |
13386
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
288 {"turbo", &lavc_param_turbo, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
17243
67ce2e4206ea
support downscaling frames for dynamic b frame decission
gpoirier
parents:
17063
diff
changeset
|
289 {"brd_scale", &lavc_param_brd_scale, CONF_TYPE_INT, CONF_RANGE, 0, 10, NULL}, |
17256
b89745a920d6
Add bidir_refine to lavc's set of options, and document it.
gpoirier
parents:
17243
diff
changeset
|
290 {"bidir_refine", &lavc_param_bidir_refine, CONF_TYPE_INT, CONF_RANGE, 0, 4, NULL}, |
17464 | 291 {"sc_factor", &lavc_param_sc_factor, CONF_TYPE_INT, CONF_RANGE, 1, INT_MAX, NULL}, |
17478
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
292 {"vglobal", &lavc_param_video_global_header, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, |
17842 | 293 {"aglobal", &lavc_param_audio_global_header, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, |
18489 | 294 {"mv0_threshold", &lavc_param_mv0_threshold, CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, |
18569 | 295 {"refs", &lavc_param_refs, CONF_TYPE_INT, CONF_RANGE, 1, 16, NULL}, |
18572 | 296 {"b_sensitivity", &lavc_param_b_sensitivity, CONF_TYPE_INT, CONF_RANGE, 1, INT_MAX, NULL}, |
5550 | 297 {NULL, NULL, 0, 0, 0, 0, NULL} |
298 }; | |
299 #endif | |
300 | |
301 struct vf_priv_s { | |
8585 | 302 muxer_stream_t* mux; |
7444 | 303 AVCodecContext *context; |
8413 | 304 AVFrame *pic; |
5550 | 305 AVCodec *codec; |
7088 | 306 FILE *stats_file; |
5550 | 307 }; |
308 | |
7088 | 309 #define stats_file (vf->priv->stats_file) |
5550 | 310 #define mux_v (vf->priv->mux) |
311 #define lavc_venc_context (vf->priv->context) | |
312 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
313 static int encode_frame(struct vf_instance_s* vf, AVFrame *pic, double pts); |
14080 | 314 |
5550 | 315 static int config(struct vf_instance_s* vf, |
316 int width, int height, int d_width, int d_height, | |
317 unsigned int flags, unsigned int outfmt){ | |
7088 | 318 int size, i; |
319 void *p; | |
320 | |
5550 | 321 mux_v->bih->biWidth=width; |
322 mux_v->bih->biHeight=height; | |
323 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8); | |
324 | |
17355 | 325 mp_msg(MSGT_MENCODER, MSGL_INFO,"videocodec: libavcodec (%dx%d fourcc=%x [%.4s])\n", |
5550 | 326 mux_v->bih->biWidth, mux_v->bih->biHeight, mux_v->bih->biCompression, |
327 (char *)&mux_v->bih->biCompression); | |
328 | |
7444 | 329 lavc_venc_context->width = width; |
330 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
|
331 if (lavc_param_vbitrate > 16000) /* != -1 */ |
7444 | 332 lavc_venc_context->bit_rate = lavc_param_vbitrate; |
5677
a21cab74cde8
bitrate>16000 means bits not kbits - noticed by George Hawkins <george_hawkins@yahoo.com>
arpi
parents:
5657
diff
changeset
|
333 else if (lavc_param_vbitrate >= 0) /* != -1 */ |
7444 | 334 lavc_venc_context->bit_rate = lavc_param_vbitrate*1000; |
5550 | 335 else |
7444 | 336 lavc_venc_context->bit_rate = 800000; /* default */ |
17480
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
337 |
19360
d4d72e5eea07
pass average bitrate from encoder to (lavf) muxer
michael
parents:
19073
diff
changeset
|
338 mux_v->avg_rate= lavc_venc_context->bit_rate; |
17480
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
339 |
7444 | 340 lavc_venc_context->bit_rate_tolerance= lavc_param_vrate_tolerance*1000; |
15307 | 341 lavc_venc_context->time_base= (AVRational){mux_v->h.dwScale, mux_v->h.dwRate}; |
7444 | 342 lavc_venc_context->qmin= lavc_param_vqmin; |
343 lavc_venc_context->qmax= lavc_param_vqmax; | |
8492 | 344 lavc_venc_context->mb_qmin= lavc_param_mb_qmin; |
345 lavc_venc_context->mb_qmax= lavc_param_mb_qmax; | |
11032 | 346 lavc_venc_context->lmin= (int)(FF_QP2LAMBDA * lavc_param_lmin + 0.5); |
347 lavc_venc_context->lmax= (int)(FF_QP2LAMBDA * lavc_param_lmax + 0.5); | |
20756 | 348 lavc_venc_context->mb_lmin= (int)(FF_QP2LAMBDA * lavc_param_mb_lmin + 0.5); |
349 lavc_venc_context->mb_lmax= (int)(FF_QP2LAMBDA * lavc_param_mb_lmax + 0.5); | |
7444 | 350 lavc_venc_context->max_qdiff= lavc_param_vqdiff; |
351 lavc_venc_context->qcompress= lavc_param_vqcompress; | |
352 lavc_venc_context->qblur= lavc_param_vqblur; | |
353 lavc_venc_context->max_b_frames= lavc_param_vmax_b_frames; | |
354 lavc_venc_context->b_quant_factor= lavc_param_vb_qfactor; | |
355 lavc_venc_context->rc_strategy= lavc_param_vrc_strategy; | |
356 lavc_venc_context->b_frame_strategy= lavc_param_vb_strategy; | |
14786 | 357 lavc_venc_context->b_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vb_qoffset + 0.5); |
7444 | 358 lavc_venc_context->luma_elim_threshold= lavc_param_luma_elim_threshold; |
359 lavc_venc_context->chroma_elim_threshold= lavc_param_chroma_elim_threshold; | |
360 lavc_venc_context->rtp_payload_size= lavc_param_packet_size; | |
361 if(lavc_param_packet_size )lavc_venc_context->rtp_mode=1; | |
362 lavc_venc_context->strict_std_compliance= lavc_param_strict; | |
363 lavc_venc_context->i_quant_factor= lavc_param_vi_qfactor; | |
14786 | 364 lavc_venc_context->i_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vi_qoffset + 0.5); |
7444 | 365 lavc_venc_context->rc_qsquish= lavc_param_rc_qsquish; |
366 lavc_venc_context->rc_qmod_amp= lavc_param_rc_qmod_amp; | |
367 lavc_venc_context->rc_qmod_freq= lavc_param_rc_qmod_freq; | |
368 lavc_venc_context->rc_eq= lavc_param_rc_eq; | |
17480
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
369 |
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
370 mux_v->max_rate= |
7444 | 371 lavc_venc_context->rc_max_rate= lavc_param_rc_max_rate*1000; |
372 lavc_venc_context->rc_min_rate= lavc_param_rc_min_rate*1000; | |
17480
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
373 |
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
374 mux_v->vbv_size= |
7444 | 375 lavc_venc_context->rc_buffer_size= lavc_param_rc_buffer_size*1000; |
17480
3993a5fad89a
pass vbv_size & max_rate from encoder to muxer over muxer_stream_t (if this is wrong/silly/10000000l then dont hesitate to flame / reverse)
michael
parents:
17478
diff
changeset
|
376 |
15781 | 377 lavc_venc_context->rc_initial_buffer_occupancy= |
378 lavc_venc_context->rc_buffer_size * | |
379 lavc_param_rc_initial_buffer_occupancy; | |
7444 | 380 lavc_venc_context->rc_buffer_aggressivity= lavc_param_rc_buffer_aggressivity; |
381 lavc_venc_context->rc_initial_cplx= lavc_param_rc_initial_cplx; | |
8341 | 382 lavc_venc_context->debug= lavc_param_debug; |
8695 | 383 lavc_venc_context->last_predictor_count= lavc_param_last_pred; |
8709 | 384 lavc_venc_context->pre_me= lavc_param_pre_me; |
8803 | 385 lavc_venc_context->me_pre_cmp= lavc_param_me_pre_cmp; |
386 lavc_venc_context->pre_dia_size= lavc_param_pre_dia_size; | |
387 lavc_venc_context->me_subpel_quality= lavc_param_me_subpel_quality; | |
9508 | 388 lavc_venc_context->me_range= lavc_param_me_range; |
9645 | 389 lavc_venc_context->intra_quant_bias= lavc_param_ibias; |
390 lavc_venc_context->inter_quant_bias= lavc_param_pbias; | |
10291 | 391 lavc_venc_context->coder_type= lavc_param_coder; |
392 lavc_venc_context->context_model= lavc_param_context; | |
11699
9165fbc7d89d
scenechange_threshold command line option patch by (Balatoni Denes <pnis at coder dot hu>)
michael
parents:
11672
diff
changeset
|
393 lavc_venc_context->scenechange_threshold= lavc_param_sc_threshold; |
11363 | 394 lavc_venc_context->noise_reduction= lavc_param_noise_reduction; |
11910 | 395 lavc_venc_context->quantizer_noise_shaping= lavc_param_qns; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
396 lavc_venc_context->inter_threshold= lavc_param_inter_threshold; |
12542 | 397 lavc_venc_context->nsse_weight= lavc_param_nssew; |
10779 | 398 if (lavc_param_intra_matrix) |
399 { | |
400 char *tmp; | |
401 | |
402 lavc_venc_context->intra_matrix = | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
403 av_malloc(sizeof(*lavc_venc_context->intra_matrix)*64); |
10779 | 404 |
405 i = 0; | |
406 while ((tmp = strsep(&lavc_param_intra_matrix, ",")) && (i < 64)) | |
407 { | |
408 if (!tmp || (tmp && !strlen(tmp))) | |
409 break; | |
410 lavc_venc_context->intra_matrix[i++] = atoi(tmp); | |
411 } | |
412 | |
413 if (i != 64) | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
414 av_freep(&lavc_venc_context->intra_matrix); |
10779 | 415 else |
416 mp_msg(MSGT_MENCODER, MSGL_V, "Using user specified intra matrix\n"); | |
417 } | |
418 if (lavc_param_inter_matrix) | |
419 { | |
420 char *tmp; | |
421 | |
422 lavc_venc_context->inter_matrix = | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
423 av_malloc(sizeof(*lavc_venc_context->inter_matrix)*64); |
10779 | 424 |
425 i = 0; | |
426 while ((tmp = strsep(&lavc_param_inter_matrix, ",")) && (i < 64)) | |
427 { | |
428 if (!tmp || (tmp && !strlen(tmp))) | |
429 break; | |
430 lavc_venc_context->inter_matrix[i++] = atoi(tmp); | |
431 } | |
432 | |
433 if (i != 64) | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
434 av_freep(&lavc_venc_context->inter_matrix); |
10779 | 435 else |
436 mp_msg(MSGT_MENCODER, MSGL_V, "Using user specified inter matrix\n"); | |
437 } | |
9508 | 438 |
7088 | 439 p= lavc_param_rc_override_string; |
440 for(i=0; p; i++){ | |
441 int start, end, q; | |
442 int e=sscanf(p, "%d,%d,%d", &start, &end, &q); | |
443 if(e!=3){ | |
444 mp_msg(MSGT_MENCODER,MSGL_ERR,"error parsing vrc_q\n"); | |
445 return 0; | |
446 } | |
7444 | 447 lavc_venc_context->rc_override= |
448 realloc(lavc_venc_context->rc_override, sizeof(RcOverride)*(i+1)); | |
449 lavc_venc_context->rc_override[i].start_frame= start; | |
450 lavc_venc_context->rc_override[i].end_frame = end; | |
7088 | 451 if(q>0){ |
7444 | 452 lavc_venc_context->rc_override[i].qscale= q; |
453 lavc_venc_context->rc_override[i].quality_factor= 1.0; | |
7088 | 454 } |
455 else{ | |
7444 | 456 lavc_venc_context->rc_override[i].qscale= 0; |
457 lavc_venc_context->rc_override[i].quality_factor= -q/100.0; | |
7088 | 458 } |
459 p= strchr(p, '/'); | |
460 if(p) p++; | |
461 } | |
7444 | 462 lavc_venc_context->rc_override_count=i; |
7088 | 463 |
7444 | 464 lavc_venc_context->mpeg_quant=lavc_param_mpeg_quant; |
7152 | 465 |
7444 | 466 lavc_venc_context->dct_algo= lavc_param_fdct; |
7564 | 467 lavc_venc_context->idct_algo= lavc_param_idct; |
7152 | 468 |
7490 | 469 lavc_venc_context->lumi_masking= lavc_param_lumi_masking; |
470 lavc_venc_context->temporal_cplx_masking= lavc_param_temporal_cplx_masking; | |
471 lavc_venc_context->spatial_cplx_masking= lavc_param_spatial_cplx_masking; | |
472 lavc_venc_context->p_masking= lavc_param_p_masking; | |
7496 | 473 lavc_venc_context->dark_masking= lavc_param_dark_masking; |
15368 | 474 lavc_venc_context->border_masking = lavc_param_border_masking; |
7490 | 475 |
8237 | 476 if (lavc_param_aspect != NULL) |
7389
6f3dd9df2cc2
aspect ratio support by encoding (currently only with mpeg4 and h263p)
alex
parents:
7368
diff
changeset
|
477 { |
8237 | 478 int par_width, par_height, e; |
479 float ratio=0; | |
480 | |
481 e= sscanf (lavc_param_aspect, "%d/%d", &par_width, &par_height); | |
482 if(e==2){ | |
483 if(par_height) | |
484 ratio= (float)par_width / (float)par_height; | |
485 }else{ | |
486 e= sscanf (lavc_param_aspect, "%f", &ratio); | |
7389
6f3dd9df2cc2
aspect ratio support by encoding (currently only with mpeg4 and h263p)
alex
parents:
7368
diff
changeset
|
487 } |
8237 | 488 |
489 if (e && ratio > 0.1 && ratio < 10.0) { | |
11195
9bfd1b5d38cd
mpeg4 has only 8bit per numerator and denominator ...
michael
parents:
11194
diff
changeset
|
490 lavc_venc_context->sample_aspect_ratio= av_d2q(ratio * height / width, 255); |
9bfd1b5d38cd
mpeg4 has only 8bit per numerator and denominator ...
michael
parents:
11194
diff
changeset
|
491 mp_dbg(MSGT_MENCODER, MSGL_DBG2, "sample_aspect_ratio: %d/%d\n", |
9bfd1b5d38cd
mpeg4 has only 8bit per numerator and denominator ...
michael
parents:
11194
diff
changeset
|
492 lavc_venc_context->sample_aspect_ratio.num, |
9bfd1b5d38cd
mpeg4 has only 8bit per numerator and denominator ...
michael
parents:
11194
diff
changeset
|
493 lavc_venc_context->sample_aspect_ratio.den); |
12061 | 494 mux_v->aspect = ratio; |
8237 | 495 mp_dbg(MSGT_MENCODER, MSGL_DBG2, "aspect_ratio: %f\n", ratio); |
496 } else { | |
497 mp_dbg(MSGT_MENCODER, MSGL_ERR, "aspect ratio: cannot parse \"%s\"\n", lavc_param_aspect); | |
498 return 0; | |
7389
6f3dd9df2cc2
aspect ratio support by encoding (currently only with mpeg4 and h263p)
alex
parents:
7368
diff
changeset
|
499 } |
6f3dd9df2cc2
aspect ratio support by encoding (currently only with mpeg4 and h263p)
alex
parents:
7368
diff
changeset
|
500 } |
13669
8f12e583f50b
10l...autoaspect was always applied to muxer aspect if using newer libavcodec...hope this is ok
rfelker
parents:
13406
diff
changeset
|
501 else if (lavc_param_autoaspect) { |
11369 | 502 lavc_venc_context->sample_aspect_ratio = av_d2q((float)d_width/d_height*height / width, 255); |
12061 | 503 mux_v->aspect = (float)d_width/d_height; |
13669
8f12e583f50b
10l...autoaspect was always applied to muxer aspect if using newer libavcodec...hope this is ok
rfelker
parents:
13406
diff
changeset
|
504 } |
7389
6f3dd9df2cc2
aspect ratio support by encoding (currently only with mpeg4 and h263p)
alex
parents:
7368
diff
changeset
|
505 |
5550 | 506 /* keyframe interval */ |
507 if (lavc_param_keyint >= 0) /* != -1 */ | |
7444 | 508 lavc_venc_context->gop_size = lavc_param_keyint; |
5550 | 509 else |
7444 | 510 lavc_venc_context->gop_size = 250; /* default */ |
5550 | 511 |
10498 | 512 lavc_venc_context->flags = 0; |
513 if (lavc_param_mb_decision) | |
5550 | 514 { |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17909
diff
changeset
|
515 mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MPCODECS_HighQualityEncodingSelected); |
10498 | 516 lavc_venc_context->mb_decision= lavc_param_mb_decision; |
5550 | 517 } |
518 | |
8587 | 519 lavc_venc_context->me_cmp= lavc_param_me_cmp; |
520 lavc_venc_context->me_sub_cmp= lavc_param_me_sub_cmp; | |
521 lavc_venc_context->mb_cmp= lavc_param_mb_cmp; | |
11753 | 522 #ifdef FF_CMP_VSAD |
523 lavc_venc_context->ildct_cmp= lavc_param_ildct_cmp; | |
524 #endif | |
8587 | 525 lavc_venc_context->dia_size= lavc_param_dia_size; |
526 lavc_venc_context->flags|= lavc_param_qpel; | |
8684 | 527 lavc_venc_context->flags|= lavc_param_trell; |
11930
f2a503cb70ba
bit_exact patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents:
11910
diff
changeset
|
528 lavc_venc_context->flags|= lavc_param_bit_exact; |
9536 | 529 lavc_venc_context->flags|= lavc_param_aic; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
530 lavc_venc_context->flags|= lavc_param_aiv; |
9536 | 531 lavc_venc_context->flags|= lavc_param_umv; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
532 lavc_venc_context->flags|= lavc_param_obmc; |
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
533 lavc_venc_context->flags|= lavc_param_loop; |
7444 | 534 lavc_venc_context->flags|= lavc_param_v4mv ? CODEC_FLAG_4MV : 0; |
535 lavc_venc_context->flags|= lavc_param_data_partitioning; | |
10963 | 536 lavc_venc_context->flags|= lavc_param_cbp; |
10974 | 537 lavc_venc_context->flags|= lavc_param_mv0; |
11445 | 538 lavc_venc_context->flags|= lavc_param_qp_rd; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
539 lavc_venc_context->flags|= lavc_param_ss; |
11702 | 540 lavc_venc_context->flags|= lavc_param_alt; |
541 lavc_venc_context->flags|= lavc_param_ilme; | |
12764
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
542 #ifdef CODEC_FLAG_CLOSED_GOP |
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
543 lavc_venc_context->flags|= lavc_param_closed_gop; |
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
544 #endif |
7444 | 545 if(lavc_param_gray) lavc_venc_context->flags|= CODEC_FLAG_GRAY; |
6461 | 546 |
7490 | 547 if(lavc_param_normalize_aqp) lavc_venc_context->flags|= CODEC_FLAG_NORMALIZE_AQP; |
7504 | 548 if(lavc_param_interlaced_dct) lavc_venc_context->flags|= CODEC_FLAG_INTERLACED_DCT; |
8347 | 549 lavc_venc_context->flags|= lavc_param_psnr; |
12764
8109997eb7d3
dc precision and closed gop patch by (Nico Sabbi <nsabbi at tiscali dot it>)
michael
parents:
12760
diff
changeset
|
550 lavc_venc_context->intra_dc_precision = lavc_param_dc_precision - 8; |
8190 | 551 lavc_venc_context->prediction_method= lavc_param_prediction_method; |
17243
67ce2e4206ea
support downscaling frames for dynamic b frame decission
gpoirier
parents:
17063
diff
changeset
|
552 lavc_venc_context->brd_scale = lavc_param_brd_scale; |
17256
b89745a920d6
Add bidir_refine to lavc's set of options, and document it.
gpoirier
parents:
17243
diff
changeset
|
553 lavc_venc_context->bidir_refine = lavc_param_bidir_refine; |
17464 | 554 lavc_venc_context->scenechange_factor = lavc_param_sc_factor; |
17478
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
555 if((lavc_param_video_global_header&1) |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
556 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){ |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
557 lavc_venc_context->flags |= CODEC_FLAG_GLOBAL_HEADER; |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
558 } |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
559 if(lavc_param_video_global_header&2){ |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
560 lavc_venc_context->flags2 |= CODEC_FLAG2_LOCAL_HEADER; |
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
561 } |
18489 | 562 lavc_venc_context->mv0_threshold = lavc_param_mv0_threshold; |
18569 | 563 lavc_venc_context->refs = lavc_param_refs; |
18572 | 564 lavc_venc_context->b_sensitivity = lavc_param_b_sensitivity; |
17478
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
565 |
10778 | 566 switch(lavc_param_format) |
567 { | |
568 case IMGFMT_YV12: | |
569 lavc_venc_context->pix_fmt = PIX_FMT_YUV420P; | |
570 break; | |
571 case IMGFMT_422P: | |
572 lavc_venc_context->pix_fmt = PIX_FMT_YUV422P; | |
573 break; | |
574 case IMGFMT_444P: | |
575 lavc_venc_context->pix_fmt = PIX_FMT_YUV444P; | |
576 break; | |
577 case IMGFMT_411P: | |
578 lavc_venc_context->pix_fmt = PIX_FMT_YUV411P; | |
579 break; | |
580 case IMGFMT_YVU9: | |
581 lavc_venc_context->pix_fmt = PIX_FMT_YUV410P; | |
582 break; | |
583 case IMGFMT_BGR32: | |
22152
1f6c89bc1c3a
Fix compilation after deprecation of some lav log level and
reimar
parents:
20756
diff
changeset
|
584 lavc_venc_context->pix_fmt = PIX_FMT_RGB32; |
10778 | 585 break; |
586 default: | |
587 mp_msg(MSGT_MENCODER,MSGL_ERR,"%s is not a supported format\n", vo_format_name(lavc_param_format)); | |
588 return 0; | |
8190 | 589 } |
10302 | 590 |
10848
5844bf004dec
2pass stats curruption fix by ("Johannes E. Schindelin" <Johannes dot Schindelin at gmx dot de>)
michael
parents:
10779
diff
changeset
|
591 if(!stats_file) { |
5778 | 592 /* lavc internal 2pass bitrate control */ |
6673 | 593 switch(lavc_param_vpass){ |
7088 | 594 case 2: |
13385
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
595 case 3: |
7444 | 596 lavc_venc_context->flags|= CODEC_FLAG_PASS2; |
10881
6c3555f4c5c3
fix 2-pass encoding with libavcodec onwin32, patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
faust3
parents:
10848
diff
changeset
|
597 stats_file= fopen(passtmpfile, "rb"); |
7088 | 598 if(stats_file==NULL){ |
599 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile); | |
600 return 0; | |
601 } | |
602 fseek(stats_file, 0, SEEK_END); | |
603 size= ftell(stats_file); | |
604 fseek(stats_file, 0, SEEK_SET); | |
605 | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
606 lavc_venc_context->stats_in= av_malloc(size + 1); |
7444 | 607 lavc_venc_context->stats_in[size]=0; |
7088 | 608 |
7444 | 609 if(fread(lavc_venc_context->stats_in, size, 1, stats_file)<1){ |
7088 | 610 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: reading from filename=%s\n", passtmpfile); |
611 return 0; | |
7089 | 612 } |
13385
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
613 if(lavc_param_vpass == 2) |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
614 break; |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
615 else |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
616 fclose(stats_file); |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
617 /* fall through */ |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
618 case 1: |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
619 lavc_venc_context->flags|= CODEC_FLAG_PASS1; |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
620 stats_file= fopen(passtmpfile, "wb"); |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
621 if(stats_file==NULL){ |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
622 mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile); |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
623 return 0; |
e488b3c628db
support generating divx2pass.log on 2nd pass patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
13074
diff
changeset
|
624 } |
13406
2f69854dfbe4
10l: Make turbo mode compatible with 3-pass encoding
gpoirier
parents:
13386
diff
changeset
|
625 if(lavc_param_turbo && (lavc_param_vpass == 1)) { |
13386
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
626 /* uses SAD comparison functions instead of other hungrier */ |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
627 lavc_venc_context->me_pre_cmp = 0; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
628 lavc_venc_context->me_cmp = 0; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
629 lavc_venc_context->me_sub_cmp = 0; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
630 lavc_venc_context->mb_cmp = 2; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
631 |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
632 /* Disables diamond motion estimation */ |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
633 lavc_venc_context->pre_dia_size = 0; |
14892
fb3a1db63672
35% faster turbo mode with 0.01dB drop. Based Loren Merritt's suggestions.
gpoirier
parents:
14878
diff
changeset
|
634 lavc_venc_context->dia_size = 1; |
13386
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
635 |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
636 lavc_venc_context->quantizer_noise_shaping = 0; // qns=0 |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
637 lavc_venc_context->noise_reduction = 0; // nr=0 |
14892
fb3a1db63672
35% faster turbo mode with 0.01dB drop. Based Loren Merritt's suggestions.
gpoirier
parents:
14878
diff
changeset
|
638 lavc_venc_context->mb_decision = 0; // mbd=0 ("realtime" encoding) |
13386
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
639 |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
640 lavc_venc_context->flags &= ~CODEC_FLAG_QPEL; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
641 lavc_venc_context->flags &= ~CODEC_FLAG_4MV; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
642 lavc_venc_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
643 lavc_venc_context->flags &= ~CODEC_FLAG_CBP_RD; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
644 lavc_venc_context->flags &= ~CODEC_FLAG_QP_RD; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
645 lavc_venc_context->flags &= ~CODEC_FLAG_MV0; |
d8ba5b72fc6c
New lavc flag: "turbo" mode which is supposed to speed up 2-pass encoding
gpoirier
parents:
13385
diff
changeset
|
646 } |
7088 | 647 break; |
6673 | 648 } |
10848
5844bf004dec
2pass stats curruption fix by ("Johannes E. Schindelin" <Johannes dot Schindelin at gmx dot de>)
michael
parents:
10779
diff
changeset
|
649 } |
5778 | 650 |
7444 | 651 lavc_venc_context->me_method = ME_ZERO+lavc_param_vme; |
5550 | 652 |
653 /* fixed qscale :p */ | |
18569 | 654 if (lavc_param_vqscale >= 0.0) |
5550 | 655 { |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17909
diff
changeset
|
656 mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MPCODECS_UsingConstantQscale, lavc_param_vqscale); |
7444 | 657 lavc_venc_context->flags |= CODEC_FLAG_QSCALE; |
11032 | 658 lavc_venc_context->global_quality= |
659 vf->priv->pic->quality = (int)(FF_QP2LAMBDA * lavc_param_vqscale + 0.5); | |
5550 | 660 } |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18976
diff
changeset
|
661 |
12760
787a1ce375df
multi-threaded lavc patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
12542
diff
changeset
|
662 if(lavc_param_threads > 1) |
787a1ce375df
multi-threaded lavc patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
12542
diff
changeset
|
663 avcodec_thread_init(lavc_venc_context, lavc_param_threads); |
5550 | 664 |
7444 | 665 if (avcodec_open(lavc_venc_context, vf->priv->codec) != 0) { |
5550 | 666 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantOpenCodec); |
667 return 0; | |
668 } | |
669 | |
7444 | 670 if (lavc_venc_context->codec->encode == NULL) { |
5550 | 671 mp_msg(MSGT_MENCODER,MSGL_ERR,"avcodec init failed (ctx->codec->encode == NULL)!\n"); |
672 return 0; | |
673 } | |
7088 | 674 |
675 /* free second pass buffer, its not needed anymore */ | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
676 av_freep(&lavc_venc_context->stats_in); |
8190 | 677 if(lavc_venc_context->bits_per_sample) |
678 mux_v->bih->biBitCount= lavc_venc_context->bits_per_sample; | |
679 if(lavc_venc_context->extradata_size){ | |
17478
7d60fe925f87
vglobal so the user can tell the encoder that she wants global headers ... one step closer to correct mov/mp4 muxing
michael
parents:
17469
diff
changeset
|
680 mux_v->bih= realloc(mux_v->bih, sizeof(BITMAPINFOHEADER) + lavc_venc_context->extradata_size); |
8190 | 681 memcpy(mux_v->bih + 1, lavc_venc_context->extradata, lavc_venc_context->extradata_size); |
682 mux_v->bih->biSize= sizeof(BITMAPINFOHEADER) + lavc_venc_context->extradata_size; | |
683 } | |
7088 | 684 |
17659 | 685 mux_v->decoder_delay = lavc_venc_context->max_b_frames ? 1 : 0; |
686 | |
5550 | 687 return 1; |
688 } | |
689 | |
690 static int control(struct vf_instance_s* vf, int request, void* data){ | |
691 | |
14080 | 692 switch(request){ |
693 case VFCTRL_FLUSH_FRAMES: | |
694 if(vf->priv->codec->capabilities & CODEC_CAP_DELAY) | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
695 while(encode_frame(vf, NULL, MP_NOPTS_VALUE) > 0); |
14080 | 696 return CONTROL_TRUE; |
697 default: | |
698 return CONTROL_UNKNOWN; | |
699 } | |
5550 | 700 } |
701 | |
702 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
703 switch(fmt){ | |
704 case IMGFMT_YV12: | |
705 case IMGFMT_IYUV: | |
706 case IMGFMT_I420: | |
10778 | 707 if(lavc_param_format == IMGFMT_YV12) |
8190 | 708 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
709 break; | |
10293 | 710 case IMGFMT_411P: |
10778 | 711 if(lavc_param_format == IMGFMT_411P) |
10293 | 712 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
713 break; | |
8190 | 714 case IMGFMT_422P: |
10778 | 715 if(lavc_param_format == IMGFMT_422P) |
8190 | 716 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
717 break; | |
10293 | 718 case IMGFMT_444P: |
10778 | 719 if(lavc_param_format == IMGFMT_444P) |
10293 | 720 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
721 break; | |
722 case IMGFMT_YVU9: | |
10778 | 723 if(lavc_param_format == IMGFMT_YVU9) |
10293 | 724 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
725 break; | |
10302 | 726 case IMGFMT_BGR32: |
10778 | 727 if(lavc_param_format == IMGFMT_BGR32) |
10302 | 728 return VFCAP_CSP_SUPPORTED | VFCAP_ACCEPT_STRIDE; |
729 break; | |
5550 | 730 } |
731 return 0; | |
732 } | |
733 | |
8347 | 734 static double psnr(double d){ |
735 if(d==0) return INFINITY; | |
736 return -10.0*log(d)/log(10); | |
737 } | |
738 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
739 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
8413 | 740 AVFrame *pic= vf->priv->pic; |
5550 | 741 |
8339 | 742 pic->data[0]=mpi->planes[0]; |
743 pic->data[1]=mpi->planes[1]; | |
744 pic->data[2]=mpi->planes[2]; | |
745 pic->linesize[0]=mpi->stride[0]; | |
746 pic->linesize[1]=mpi->stride[1]; | |
747 pic->linesize[2]=mpi->stride[2]; | |
5550 | 748 |
11672
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
749 if(lavc_param_interlaced_dct){ |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
750 if((mpi->fields & MP_IMGFIELD_ORDERED) && (mpi->fields & MP_IMGFIELD_INTERLACED)) |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
751 pic->top_field_first= !!(mpi->fields & MP_IMGFIELD_TOP_FIRST); |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
752 else |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
753 pic->top_field_first= 1; |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
754 |
11672
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
755 if(lavc_param_top!=-1) |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
756 pic->top_field_first= lavc_param_top; |
62ca7e82de82
better top_field_first behaviour (mostly what rich suggested)
michael
parents:
11670
diff
changeset
|
757 } |
11670
ffca211f32f9
using top_field_first from mpi, and support overriding it
michael
parents:
11445
diff
changeset
|
758 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
759 return (encode_frame(vf, pic, pts) >= 0); |
14080 | 760 } |
761 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
762 static int encode_frame(struct vf_instance_s* vf, AVFrame *pic, double pts){ |
14080 | 763 const char pict_type_char[5]= {'?', 'I', 'P', 'B', 'S'}; |
764 int out_size; | |
17907 | 765 double dts; |
14080 | 766 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
767 if(pic){ |
17909 | 768 #if 0 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
769 pic->opaque= malloc(sizeof(pts)); |
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
770 memcpy(pic->opaque, &pts, sizeof(pts)); |
17909 | 771 #else |
772 if(pts != MP_NOPTS_VALUE) | |
773 pic->pts= floor(pts / av_q2d(lavc_venc_context->time_base) + 0.5); | |
774 else | |
775 pic->pts= MP_NOPTS_VALUE; | |
776 #endif | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
777 } |
7444 | 778 out_size = avcodec_encode_video(lavc_venc_context, mux_v->buffer, mux_v->buffer_size, |
8339 | 779 pic); |
5550 | 780 |
17907 | 781 if(pts != MP_NOPTS_VALUE) |
782 dts= pts - lavc_venc_context->delay * av_q2d(lavc_venc_context->time_base); | |
783 else | |
784 dts= MP_NOPTS_VALUE; | |
17909 | 785 #if 0 |
17907 | 786 pts= lavc_venc_context->coded_frame->opaque ? |
787 *(double*)lavc_venc_context->coded_frame->opaque | |
788 : MP_NOPTS_VALUE; | |
17909 | 789 #else |
790 if(lavc_venc_context->coded_frame->pts != MP_NOPTS_VALUE) | |
791 pts= lavc_venc_context->coded_frame->pts * av_q2d(lavc_venc_context->time_base); | |
792 else | |
793 pts= MP_NOPTS_VALUE; | |
794 assert(MP_NOPTS_VALUE == AV_NOPTS_VALUE); | |
795 #endif | |
796 //fprintf(stderr, "ve_lavc %f/%f\n", dts, pts); | |
17659 | 797 if(out_size == 0) { |
798 ++mux_v->encoder_delay; | |
14080 | 799 return 0; |
17659 | 800 } |
9536 | 801 |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
802 muxer_write_chunk(mux_v,out_size,lavc_venc_context->coded_frame->key_frame?0x10:0, |
17907 | 803 dts, pts); |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17886
diff
changeset
|
804 free(lavc_venc_context->coded_frame->opaque); |
17907 | 805 lavc_venc_context->coded_frame->opaque= NULL; |
8413 | 806 |
8347 | 807 /* store psnr / pict size / type / qscale */ |
808 if(lavc_param_psnr){ | |
809 static FILE *fvstats=NULL; | |
810 char filename[20]; | |
811 double f= lavc_venc_context->width*lavc_venc_context->height*255.0*255.0; | |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
812 double quality=0.0; |
9868 | 813 int8_t *q; |
8347 | 814 |
815 if(!fvstats) { | |
816 time_t today2; | |
817 struct tm *today; | |
818 today2 = time(NULL); | |
819 today = localtime(&today2); | |
820 sprintf(filename, "psnr_%02d%02d%02d.log", today->tm_hour, | |
821 today->tm_min, today->tm_sec); | |
822 fvstats = fopen(filename,"w"); | |
823 if(!fvstats) { | |
824 perror("fopen"); | |
825 lavc_param_psnr=0; // disable block | |
12983 | 826 mp_msg(MSGT_MENCODER,MSGL_ERR,"Can't open %s for writing. Check its permissions.\n",filename); |
14080 | 827 return -1; |
8347 | 828 /*exit(1);*/ |
829 } | |
830 } | |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
831 |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
832 // average MB quantizer |
9868 | 833 q = lavc_venc_context->coded_frame->qscale_table; |
834 if(q) { | |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
835 int x, y; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
836 int w = (lavc_venc_context->width+15) >> 4; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
837 int h = (lavc_venc_context->height+15) >> 4; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
838 for( y = 0; y < h; y++ ) { |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
839 for( x = 0; x < w; x++ ) |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
840 quality += (double)*(q+x); |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
841 q += lavc_venc_context->coded_frame->qstride; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
842 } |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
843 quality /= w * h; |
9868 | 844 } else |
11032 | 845 quality = lavc_venc_context->coded_frame->quality / (float)FF_QP2LAMBDA; |
8347 | 846 |
847 fprintf(fvstats, "%6d, %2.2f, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n", | |
8413 | 848 lavc_venc_context->coded_frame->coded_picture_number, |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9645
diff
changeset
|
849 quality, |
8347 | 850 out_size, |
8413 | 851 psnr(lavc_venc_context->coded_frame->error[0]/f), |
852 psnr(lavc_venc_context->coded_frame->error[1]*4/f), | |
853 psnr(lavc_venc_context->coded_frame->error[2]*4/f), | |
854 psnr((lavc_venc_context->coded_frame->error[0]+lavc_venc_context->coded_frame->error[1]+lavc_venc_context->coded_frame->error[2])/(f*1.5)), | |
855 pict_type_char[lavc_venc_context->coded_frame->pict_type] | |
8347 | 856 ); |
857 } | |
7088 | 858 /* store stats if there are any */ |
7444 | 859 if(lavc_venc_context->stats_out && stats_file) |
860 fprintf(stats_file, "%s", lavc_venc_context->stats_out); | |
14080 | 861 return out_size; |
5550 | 862 } |
863 | |
5551 | 864 static void uninit(struct vf_instance_s* vf){ |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18976
diff
changeset
|
865 |
8347 | 866 if(lavc_param_psnr){ |
867 double f= lavc_venc_context->width*lavc_venc_context->height*255.0*255.0; | |
8413 | 868 f*= lavc_venc_context->coded_frame->coded_picture_number; |
8347 | 869 |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17909
diff
changeset
|
870 mp_msg(MSGT_MENCODER, MSGL_INFO, "PSNR: Y:%2.2f, Cb:%2.2f, Cr:%2.2f, All:%2.2f\n", |
8347 | 871 psnr(lavc_venc_context->error[0]/f), |
872 psnr(lavc_venc_context->error[1]*4/f), | |
873 psnr(lavc_venc_context->error[2]*4/f), | |
874 psnr((lavc_venc_context->error[0]+lavc_venc_context->error[1]+lavc_venc_context->error[2])/(f*1.5)) | |
875 ); | |
876 } | |
877 | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
878 av_freep(&lavc_venc_context->intra_matrix); |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
879 av_freep(&lavc_venc_context->inter_matrix); |
10779 | 880 |
7444 | 881 avcodec_close(lavc_venc_context); |
7088 | 882 |
883 if(stats_file) fclose(stats_file); | |
7089 | 884 |
7088 | 885 /* free rc_override */ |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
886 av_freep(&lavc_venc_context->rc_override); |
7444 | 887 |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14080
diff
changeset
|
888 av_freep(&vf->priv->context); |
5551 | 889 } |
890 | |
5550 | 891 //===========================================================================// |
892 | |
893 static int vf_open(vf_instance_t *vf, char* args){ | |
5551 | 894 vf->uninit=uninit; |
5550 | 895 vf->config=config; |
14878 | 896 vf->default_caps=VFCAP_CONSTANT; |
5550 | 897 vf->control=control; |
898 vf->query_format=query_format; | |
899 vf->put_image=put_image; | |
900 vf->priv=malloc(sizeof(struct vf_priv_s)); | |
901 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 902 vf->priv->mux=(muxer_stream_t*)args; |
5550 | 903 |
5977
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
904 /* 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
|
905 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
|
906 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
|
907 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
|
908 { |
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
909 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
|
910 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
|
911 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
|
912 } |
14057 | 913 else if (lavc_param_vcodec && (!strcasecmp(lavc_param_vcodec, "huffyuv") |
914 || !strcasecmp(lavc_param_vcodec, "ffvhuff"))) | |
8190 | 915 { |
916 /* XXX: hack: huffyuv needs to store huffman tables (allthough we dunno the size yet ...) */ | |
917 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+1000); | |
918 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER)+1000); | |
919 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+1000; | |
920 } | |
10131 | 921 else if (lavc_param_vcodec && !strcasecmp(lavc_param_vcodec, "asv1")) |
922 { | |
923 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+8); | |
924 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER)+8); | |
925 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+8; | |
926 } | |
10777 | 927 else if (lavc_param_vcodec && !strcasecmp(lavc_param_vcodec, "asv2")) |
928 { | |
929 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+8); | |
930 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER)+8); | |
931 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+8; | |
932 } | |
8587 | 933 else if (lavc_param_vcodec && !strcasecmp(lavc_param_vcodec, "wmv2")) |
934 { | |
935 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+4); | |
936 memset(mux_v->bih, 0, sizeof(BITMAPINFOHEADER)+4); | |
937 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+4; | |
938 } | |
5977
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
939 else |
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
940 { |
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
941 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)); |
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
942 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
|
943 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
944 } |
5550 | 945 mux_v->bih->biWidth=0; |
946 mux_v->bih->biHeight=0; | |
947 mux_v->bih->biPlanes=1; | |
948 mux_v->bih->biBitCount=24; | |
949 if (!lavc_param_vcodec) | |
950 { | |
5977
e8f6f477aad0
a hack to make ffmjpeg created files viewable with windows dlls too
alex
parents:
5972
diff
changeset
|
951 printf("No libavcodec codec specified! It's required!\n"); |
5550 | 952 return 0; |
953 } | |
954 | |
955 if (!strcasecmp(lavc_param_vcodec, "mpeg1") || !strcasecmp(lavc_param_vcodec, "mpeg1video")) | |
956 mux_v->bih->biCompression = mmioFOURCC('m', 'p', 'g', '1'); | |
10699 | 957 else if (!strcasecmp(lavc_param_vcodec, "mpeg2") || !strcasecmp(lavc_param_vcodec, "mpeg2video")) |
958 mux_v->bih->biCompression = mmioFOURCC('m', 'p', 'g', '2'); | |
5550 | 959 else if (!strcasecmp(lavc_param_vcodec, "h263") || !strcasecmp(lavc_param_vcodec, "h263p")) |
960 mux_v->bih->biCompression = mmioFOURCC('h', '2', '6', '3'); | |
961 else if (!strcasecmp(lavc_param_vcodec, "rv10")) | |
962 mux_v->bih->biCompression = mmioFOURCC('R', 'V', '1', '0'); | |
963 else if (!strcasecmp(lavc_param_vcodec, "mjpeg")) | |
964 mux_v->bih->biCompression = mmioFOURCC('M', 'J', 'P', 'G'); | |
10302 | 965 else if (!strcasecmp(lavc_param_vcodec, "ljpeg")) |
966 mux_v->bih->biCompression = mmioFOURCC('L', 'J', 'P', 'G'); | |
5550 | 967 else if (!strcasecmp(lavc_param_vcodec, "mpeg4")) |
14766 | 968 mux_v->bih->biCompression = mmioFOURCC('F', 'M', 'P', '4'); |
5550 | 969 else if (!strcasecmp(lavc_param_vcodec, "msmpeg4")) |
970 mux_v->bih->biCompression = mmioFOURCC('d', 'i', 'v', '3'); | |
5972 | 971 else if (!strcasecmp(lavc_param_vcodec, "msmpeg4v2")) |
972 mux_v->bih->biCompression = mmioFOURCC('M', 'P', '4', '2'); | |
6461 | 973 else if (!strcasecmp(lavc_param_vcodec, "wmv1")) |
974 mux_v->bih->biCompression = mmioFOURCC('W', 'M', 'V', '1'); | |
8587 | 975 else if (!strcasecmp(lavc_param_vcodec, "wmv2")) |
976 mux_v->bih->biCompression = mmioFOURCC('W', 'M', 'V', '2'); | |
8190 | 977 else if (!strcasecmp(lavc_param_vcodec, "huffyuv")) |
978 mux_v->bih->biCompression = mmioFOURCC('H', 'F', 'Y', 'U'); | |
14057 | 979 else if (!strcasecmp(lavc_param_vcodec, "ffvhuff")) |
980 mux_v->bih->biCompression = mmioFOURCC('F', 'F', 'V', 'H'); | |
10131 | 981 else if (!strcasecmp(lavc_param_vcodec, "asv1")) |
982 mux_v->bih->biCompression = mmioFOURCC('A', 'S', 'V', '1'); | |
10777 | 983 else if (!strcasecmp(lavc_param_vcodec, "asv2")) |
984 mux_v->bih->biCompression = mmioFOURCC('A', 'S', 'V', '2'); | |
10264 | 985 else if (!strcasecmp(lavc_param_vcodec, "ffv1")) |
986 mux_v->bih->biCompression = mmioFOURCC('F', 'F', 'V', '1'); | |
13074 | 987 else if (!strcasecmp(lavc_param_vcodec, "snow")) |
988 mux_v->bih->biCompression = mmioFOURCC('S', 'N', 'O', 'W'); | |
20419 | 989 else if (!strcasecmp(lavc_param_vcodec, "flv")) |
990 mux_v->bih->biCompression = mmioFOURCC('F', 'L', 'V', '1'); | |
5550 | 991 else |
992 mux_v->bih->biCompression = mmioFOURCC(lavc_param_vcodec[0], | |
993 lavc_param_vcodec[1], lavc_param_vcodec[2], lavc_param_vcodec[3]); /* FIXME!!! */ | |
994 | |
995 if (!avcodec_inited){ | |
996 avcodec_init(); | |
997 avcodec_register_all(); | |
998 avcodec_inited=1; | |
999 } | |
1000 | |
1001 vf->priv->codec = (AVCodec *)avcodec_find_encoder_by_name(lavc_param_vcodec); | |
1002 if (!vf->priv->codec) { | |
1003 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_MissingLAVCcodec, lavc_param_vcodec); | |
1004 return 0; | |
1005 } | |
1006 | |
8413 | 1007 vf->priv->pic = avcodec_alloc_frame(); |
7444 | 1008 vf->priv->context = avcodec_alloc_context(); |
1009 | |
5550 | 1010 return 1; |
1011 } | |
1012 | |
1013 vf_info_t ve_info_lavc = { | |
1014 "libavcodec encoder", | |
1015 "lavc", | |
6673 | 1016 "A'rpi, Alex, Michael", |
5550 | 1017 "for internal use by mencoder", |
1018 vf_open | |
1019 }; | |
1020 | |
1021 //===========================================================================// |