Mercurial > mplayer.hg
annotate libmpcodecs/vd_ffmpeg.c @ 33258:6170442680ac
Add code to generate and compare all object files MPlayer uses.
Useful to verify that cosmetic changes really are only cosmetic
(note that there will be false positives, e.g. due to debug symbols
or line numbers from asserts and similar).
author | reimar |
---|---|
date | Sun, 01 May 2011 17:10:02 +0000 |
parents | 54faee206150 |
children | e180057420a5 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30191
diff
changeset
|
18 |
4952 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <assert.h> | |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
22 #include <time.h> |
4952 | 23 |
24 #include "config.h" | |
25 #include "mp_msg.h" | |
26 #include "help_mp.h" | |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
27 #include "av_opts.h" |
4952 | 28 |
21372 | 29 #include "libavutil/common.h" |
21457 | 30 #include "libavutil/intreadwrite.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21498
diff
changeset
|
31 #include "mpbswap.h" |
28527 | 32 #include "fmt-conversion.h" |
4952 | 33 |
34 #include "vd_internal.h" | |
31959
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
35 #include "vd_ffmpeg.h" |
4952 | 36 |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
37 static const vd_info_t info = { |
28523 | 38 "FFmpeg's libavcodec codec family", |
39 "ffmpeg", | |
40 "A'rpi", | |
41 "A'rpi, Michael, Alex", | |
42 "native codecs" | |
4952 | 43 }; |
44 | |
45 LIBVD_EXTERN(ffmpeg) | |
46 | |
47 #include "libavcodec/avcodec.h" | |
48 | |
30074 | 49 #if AVPALETTE_SIZE > 1024 |
50 #error palette too large, adapt libmpcodecs/vf.c:vf_get_image | |
51 #endif | |
52 | |
28412 | 53 #if CONFIG_XVMC |
28522
fee39b6b62ea
Remove local copy of xvmc_render.h, it is now an installed header in FFmpeg.
diego
parents:
28510
diff
changeset
|
54 #include "libavcodec/xvmc.h" |
10362 | 55 #endif |
56 | |
25962 | 57 int avcodec_initialized=0; |
4952 | 58 |
5280 | 59 typedef struct { |
60 AVCodecContext *avctx; | |
8413 | 61 AVFrame *pic; |
17973 | 62 enum PixelFormat pix_fmt; |
5482 | 63 int do_slices; |
6734 | 64 int do_dr1; |
25962 | 65 int vo_initialized; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
66 int best_csp; |
8339 | 67 int b_age; |
68 int ip_age[2]; | |
8411 | 69 int qp_stat[32]; |
70 double qp_sum; | |
71 double inv_qp_sum; | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
72 int ip_count; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
73 int b_count; |
22277
de3ca43ae51e
reinit the vo when aspect ratio changes; patch by C.E. Hoyos approved by Michael
nicodvb
parents:
22222
diff
changeset
|
74 AVRational last_sample_aspect_ratio; |
5280 | 75 } vd_ffmpeg_ctx; |
76 | |
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:
10471
diff
changeset
|
77 #include "m_option.h" |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
78 |
8413 | 79 static int get_buffer(AVCodecContext *avctx, AVFrame *pic); |
80 static void release_buffer(AVCodecContext *avctx, AVFrame *pic); | |
29914
67b386883561
Add const to draw_slice argument to match what FFmpeg expects for draw_horiz_band.
reimar
parents:
29879
diff
changeset
|
81 static void draw_slice(struct AVCodecContext *s, const AVFrame *src, int offset[4], |
28552
d7e1fd202d85
Get rid of mc_render_slice and use the generic draw_slice instead.
reimar
parents:
28548
diff
changeset
|
82 int y, int type, int height); |
6739 | 83 |
28525 | 84 static enum PixelFormat get_format(struct AVCodecContext *avctx, |
85 const enum PixelFormat *pix_fmt); | |
10362 | 86 |
7722 | 87 static int lavc_param_workaround_bugs= FF_BUG_AUTODETECT; |
88 static int lavc_param_error_resilience=2; | |
89 static int lavc_param_error_concealment=3; | |
26395 | 90 static int lavc_param_gray=0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
91 static int lavc_param_vstats=0; |
7564 | 92 static int lavc_param_idct_algo=0; |
8341 | 93 static int lavc_param_debug=0; |
11702 | 94 static int lavc_param_vismv=0; |
12670 | 95 static int lavc_param_skip_top=0; |
96 static int lavc_param_skip_bottom=0; | |
13230 | 97 static int lavc_param_fast=0; |
13473 | 98 static int lavc_param_lowres=0; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
99 static char *lavc_param_lowres_str=NULL; |
15986 | 100 static char *lavc_param_skip_loop_filter_str = NULL; |
101 static char *lavc_param_skip_idct_str = NULL; | |
102 static char *lavc_param_skip_frame_str = NULL; | |
17080 | 103 static int lavc_param_threads=1; |
17217 | 104 static int lavc_param_bitexact=0; |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
105 static char *lavc_avopt = NULL; |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
106 static enum AVDiscard skip_idct; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
107 static enum AVDiscard skip_frame; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
108 |
31953 | 109 static const mp_image_t mpi_no_picture = |
110 { | |
111 .type = MP_IMGTYPE_INCOMPLETE | |
112 }; | |
113 | |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
24854
diff
changeset
|
114 const m_option_t lavc_decode_opts_conf[]={ |
28523 | 115 {"bug", &lavc_param_workaround_bugs, CONF_TYPE_INT, CONF_RANGE, -1, 999999, NULL}, |
116 {"er", &lavc_param_error_resilience, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
117 {"gray", &lavc_param_gray, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, | |
118 {"idct", &lavc_param_idct_algo, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
119 {"ec", &lavc_param_error_concealment, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
120 {"vstats", &lavc_param_vstats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
121 {"debug", &lavc_param_debug, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, | |
122 {"vismv", &lavc_param_vismv, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, | |
123 {"st", &lavc_param_skip_top, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, | |
124 {"sb", &lavc_param_skip_bottom, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, | |
125 {"fast", &lavc_param_fast, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG2_FAST, NULL}, | |
126 {"lowres", &lavc_param_lowres_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
127 {"skiploopfilter", &lavc_param_skip_loop_filter_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
128 {"skipidct", &lavc_param_skip_idct_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
129 {"skipframe", &lavc_param_skip_frame_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
130 {"threads", &lavc_param_threads, CONF_TYPE_INT, CONF_RANGE, 1, 8, NULL}, | |
131 {"bitexact", &lavc_param_bitexact, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_BITEXACT, NULL}, | |
132 {"o", &lavc_avopt, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
133 {NULL, NULL, 0, 0, 0, 0, NULL} | |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
134 }; |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
135 |
15986 | 136 static enum AVDiscard str2AVDiscard(char *str) { |
26694 | 137 if (!str) return AVDISCARD_DEFAULT; |
138 if (strcasecmp(str, "none" ) == 0) return AVDISCARD_NONE; | |
139 if (strcasecmp(str, "default") == 0) return AVDISCARD_DEFAULT; | |
140 if (strcasecmp(str, "nonref" ) == 0) return AVDISCARD_NONREF; | |
141 if (strcasecmp(str, "bidir" ) == 0) return AVDISCARD_BIDIR; | |
142 if (strcasecmp(str, "nonkey" ) == 0) return AVDISCARD_NONKEY; | |
143 if (strcasecmp(str, "all" ) == 0) return AVDISCARD_ALL; | |
144 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Unknown discard value %s\n", str); | |
15986 | 145 return AVDISCARD_DEFAULT; |
146 } | |
147 | |
4952 | 148 // to set/get/query special features/parameters |
28525 | 149 static int control(sh_video_t *sh, int cmd, void *arg, ...){ |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
150 vd_ffmpeg_ctx *ctx = sh->context; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
151 AVCodecContext *avctx = ctx->avctx; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
152 switch(cmd){ |
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
153 case VDCTRL_QUERY_FORMAT: |
28523 | 154 { |
28525 | 155 int format =(*((int *)arg)); |
156 if(format == ctx->best_csp) return CONTROL_TRUE;//supported | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
157 // possible conversions: |
28525 | 158 switch(format){ |
6739 | 159 case IMGFMT_YV12: |
160 case IMGFMT_IYUV: | |
161 case IMGFMT_I420: | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
162 // "converted" using pointer/stride modification |
32507
97738e6f82dc
Use IMGFMT to compare instead of PIX_FMT to avoid issues
reimar
parents:
32488
diff
changeset
|
163 if(ctx->best_csp == IMGFMT_YV12) return CONTROL_TRUE;// u/v swap |
97738e6f82dc
Use IMGFMT to compare instead of PIX_FMT to avoid issues
reimar
parents:
32488
diff
changeset
|
164 if(ctx->best_csp == IMGFMT_422P && !ctx->do_dr1) return CONTROL_TRUE;// half stride |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
165 break; |
28412 | 166 #if CONFIG_XVMC |
10452 | 167 case IMGFMT_XVMC_IDCT_MPEG2: |
168 case IMGFMT_XVMC_MOCO_MPEG2: | |
10471 | 169 if(avctx->pix_fmt==PIX_FMT_XVMC_MPEG2_IDCT) return CONTROL_TRUE; |
10452 | 170 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
171 } |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
172 return CONTROL_FALSE; |
28523 | 173 } |
11977
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
174 case VDCTRL_RESYNC_STREAM: |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
175 avcodec_flush_buffers(avctx); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
176 return CONTROL_TRUE; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
177 case VDCTRL_QUERY_UNSEEN_FRAMES: |
33152
0c2838570652
Revert r33231, FFmpeg already sets has_b_frames up this way for
reimar
parents:
33144
diff
changeset
|
178 // has_b_frames includes delay due to frame-multithreading |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
179 return avctx->has_b_frames + 10; |
10362 | 180 } |
4952 | 181 return CONTROL_UNKNOWN; |
182 } | |
183 | |
30555
ad6740b58b0d
libmpcodecs: Mark functions not used outside of their files as static.
diego
parents:
30504
diff
changeset
|
184 static void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, |
ad6740b58b0d
libmpcodecs: Mark functions not used outside of their files as static.
diego
parents:
30504
diff
changeset
|
185 va_list vl) |
20741 | 186 { |
187 static int print_prefix=1; | |
28525 | 188 AVClass *avc= ptr ? *(AVClass **)ptr : NULL; |
20741 | 189 int type= MSGT_FIXME; |
190 int mp_level; | |
191 | |
21242 | 192 switch(level){ |
29842
5087d7ad1f5b
Map AV_LOG_VERBOSE to MSGL_V in order to avoid spurious log output.
diego
parents:
29667
diff
changeset
|
193 case AV_LOG_VERBOSE: mp_level = MSGL_V ; break; |
21242 | 194 case AV_LOG_DEBUG: mp_level= MSGL_V ; break; |
195 case AV_LOG_INFO : mp_level= MSGL_INFO; break; | |
196 case AV_LOG_ERROR: mp_level= MSGL_ERR ; break; | |
32592
9ec31cdc76ad
Support very high libav* message levels as e.g. the flac parser
reimar
parents:
32537
diff
changeset
|
197 default : mp_level= level > AV_LOG_DEBUG ? MSGL_DBG2 : MSGL_ERR; break; |
21242 | 198 } |
199 | |
20741 | 200 if(ptr){ |
201 if(!strcmp(avc->class_name, "AVCodecContext")){ | |
28525 | 202 AVCodecContext *s= ptr; |
20741 | 203 if(s->codec){ |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32686
diff
changeset
|
204 if(s->codec->type == AVMEDIA_TYPE_AUDIO){ |
20741 | 205 if(s->codec->decode) |
206 type= MSGT_DECAUDIO; | |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32686
diff
changeset
|
207 }else if(s->codec->type == AVMEDIA_TYPE_VIDEO){ |
20741 | 208 if(s->codec->decode) |
209 type= MSGT_DECVIDEO; | |
210 } | |
22316
f3d7a1b58a82
cosmetics: Fix some common typos, appropiate --> appropRiate,
diego
parents:
22277
diff
changeset
|
211 //FIXME subtitles, encoders (what msgt for them? there is no appropriate ...) |
20741 | 212 } |
213 }else if(!strcmp(avc->class_name, "AVFormatContext")){ | |
28525 | 214 #if 0 //needs libavformat include FIXME iam too lazy to do this cleanly, probably the whole should be moved out of this file ... |
215 AVFormatContext *s= ptr; | |
20741 | 216 if(s->iformat) |
217 type= MSGT_DEMUXER; | |
218 else if(s->oformat) | |
219 type= MSGT_MUXER; | |
220 #endif | |
221 } | |
222 } | |
223 | |
31541
0ccd18ec15c3
Fix ffmpeg logging: mp_msg_test must be called after the proper target
reimar
parents:
31520
diff
changeset
|
224 if (!mp_msg_test(type, mp_level)) return; |
0ccd18ec15c3
Fix ffmpeg logging: mp_msg_test must be called after the proper target
reimar
parents:
31520
diff
changeset
|
225 |
20741 | 226 if(print_prefix && avc) { |
227 mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); | |
228 } | |
229 | |
21243 | 230 print_prefix= strchr(fmt, '\n') != NULL; |
32378
150df72e808f
Add a va_list version of mp_msg and use it to avoid yet another intermediate
reimar
parents:
32105
diff
changeset
|
231 mp_msg_va(type, mp_level, fmt, vl); |
20741 | 232 } |
233 | |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
234 static void set_format_params(struct AVCodecContext *avctx, enum PixelFormat fmt){ |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
235 int imgfmt; |
30191
c2fc252b0d14
Avoid the error message "Unsupported PixelFormat -1" for ffh264 decoding
zuxy
parents:
30114
diff
changeset
|
236 if (fmt == PIX_FMT_NONE) |
c2fc252b0d14
Avoid the error message "Unsupported PixelFormat -1" for ffh264 decoding
zuxy
parents:
30114
diff
changeset
|
237 return; |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
238 imgfmt = pixfmt2imgfmt(fmt); |
32488 | 239 if (IMGFMT_IS_HWACCEL(imgfmt)) { |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
240 sh_video_t *sh = avctx->opaque; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
241 vd_ffmpeg_ctx *ctx = sh->context; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
242 ctx->do_dr1 = 1; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
243 ctx->do_slices = 1; |
33041 | 244 // HACK: FFmpeg thread handling is a major mess and |
245 // hinders any attempt to decide on hwaccel after the | |
246 // codec is open. We really want this to change, so | |
247 // just beat it until it's dead | |
28732 | 248 avctx->thread_count = 1; |
33041 | 249 avctx->active_thread_type = 0; |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
250 avctx->get_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
251 avctx->release_buffer = release_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
252 avctx->reget_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
253 avctx->draw_horiz_band = draw_slice; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
254 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedMPEG2); |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
255 avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; |
33044
d2b6fbd11f20
Add condition that lets us switch FFmpeg XvMC decoder back from
reimar
parents:
33043
diff
changeset
|
256 } else { |
d2b6fbd11f20
Add condition that lets us switch FFmpeg XvMC decoder back from
reimar
parents:
33043
diff
changeset
|
257 avctx->slice_flags &= ~(SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD); |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
258 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
259 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
260 |
31959
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
261 void init_avcodec(void) |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
262 { |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
263 if (!avcodec_initialized) { |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
264 avcodec_init(); |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
265 avcodec_register_all(); |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
266 avcodec_initialized = 1; |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
267 av_log_set_callback(mp_msp_av_log_callback); |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
268 } |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
269 } |
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
270 |
4952 | 271 // init driver |
272 static int init(sh_video_t *sh){ | |
5280 | 273 AVCodecContext *avctx; |
274 vd_ffmpeg_ctx *ctx; | |
5457
f248c9e86423
config vo only if aspect really changed and width&&height isn't changed (if w||h changes, we set it later)
alex
parents:
5331
diff
changeset
|
275 AVCodec *lavc_codec; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
276 int lowres_w=0; |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
277 int do_vis_debug= lavc_param_vismv || (lavc_param_debug&(FF_DEBUG_VIS_MB_TYPE|FF_DEBUG_VIS_QP)); |
33032
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
278 // slice is rather broken with threads, so disable that combination unless |
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
279 // explicitly requested |
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
280 int use_slices = vd_use_slices > 0 || (vd_use_slices < 0 && lavc_param_threads <= 1); |
4952 | 281 |
31959
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
282 init_avcodec(); |
5280 | 283 |
284 ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx)); | |
285 if (!ctx) | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
286 return 0; |
5280 | 287 memset(ctx, 0, sizeof(vd_ffmpeg_ctx)); |
28509 | 288 |
31926
45966266392b
Remove pointless casts of avcodec_find_decoder_by_name() return value.
diego
parents:
31541
diff
changeset
|
289 lavc_codec = avcodec_find_decoder_by_name(sh->codec->dll); |
5457
f248c9e86423
config vo only if aspect really changed and width&&height isn't changed (if w||h changes, we set it later)
alex
parents:
5331
diff
changeset
|
290 if(!lavc_codec){ |
28525 | 291 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MissingLAVCcodec, sh->codec->dll); |
21498 | 292 uninit(sh); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
293 return 0; |
4952 | 294 } |
5482 | 295 |
33032
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
296 if(use_slices && (lavc_codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND) && !do_vis_debug) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
297 ctx->do_slices=1; |
28509 | 298 |
32686 | 299 if(lavc_codec->capabilities&CODEC_CAP_DR1 && !do_vis_debug && lavc_codec->id != CODEC_ID_H264 && lavc_codec->id != CODEC_ID_INTERPLAY_VIDEO && lavc_codec->id != CODEC_ID_ROQ && lavc_codec->id != CODEC_ID_VP8 && lavc_codec->id != CODEC_ID_LAGARITH) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
300 ctx->do_dr1=1; |
8339 | 301 ctx->b_age= ctx->ip_age[0]= ctx->ip_age[1]= 256*256*256*64; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
302 ctx->ip_count= ctx->b_count= 0; |
7444 | 303 |
8413 | 304 ctx->pic = avcodec_alloc_frame(); |
7444 | 305 ctx->avctx = avcodec_alloc_context(); |
5280 | 306 avctx = ctx->avctx; |
33255
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
307 avcodec_get_context_defaults3(avctx, lavc_codec); |
28601
88bb92d3c5b4
Set avctx->opaque already at init instead of decode so it can be used in
reimar
parents:
28595
diff
changeset
|
308 avctx->opaque = sh; |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32686
diff
changeset
|
309 avctx->codec_type = AVMEDIA_TYPE_VIDEO; |
29667
8cfbe411de01
Make sure avctx->codec_type and codec_id are set, since libavcodec
reimar
parents:
29401
diff
changeset
|
310 avctx->codec_id = lavc_codec->id; |
6739 | 311 |
33043
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
312 avctx->get_format = get_format; |
6739 | 313 if(ctx->do_dr1){ |
28509 | 314 avctx->flags|= CODEC_FLAG_EMU_EDGE; |
33188
d5406d5a0aec
Pointless vertical alignment cosmetics to test repository write.
michael
parents:
33168
diff
changeset
|
315 avctx-> get_buffer= get_buffer; |
8339 | 316 avctx->release_buffer= release_buffer; |
33188
d5406d5a0aec
Pointless vertical alignment cosmetics to test repository write.
michael
parents:
33168
diff
changeset
|
317 avctx-> reget_buffer= get_buffer; |
6739 | 318 } |
7303 | 319 |
17217 | 320 avctx->flags|= lavc_param_bitexact; |
28509 | 321 |
31954
7eaaed7331f3
Set coded_width/coded_height instead of width/height since that's
reimar
parents:
31953
diff
changeset
|
322 avctx->coded_width = sh->disp_w; |
7eaaed7331f3
Set coded_width/coded_height instead of width/height since that's
reimar
parents:
31953
diff
changeset
|
323 avctx->coded_height= sh->disp_h; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
324 avctx->workaround_bugs= lavc_param_workaround_bugs; |
27517 | 325 avctx->error_recognition= lavc_param_error_resilience; |
26395 | 326 if(lavc_param_gray) avctx->flags|= CODEC_FLAG_GRAY; |
13230 | 327 avctx->flags2|= lavc_param_fast; |
9547 | 328 avctx->codec_tag= sh->format; |
10847 | 329 avctx->stream_codec_tag= sh->video.fccHandler; |
7564 | 330 avctx->idct_algo= lavc_param_idct_algo; |
7722 | 331 avctx->error_concealment= lavc_param_error_concealment; |
8341 | 332 avctx->debug= lavc_param_debug; |
17073
177c02c3785f
make -lavdopts debug work again, patch by Jason Tackaberry ( tack AH sault POIS org )
gpoirier
parents:
16963
diff
changeset
|
333 if (lavc_param_debug) |
22153 | 334 av_log_set_level(AV_LOG_DEBUG); |
11702 | 335 avctx->debug_mv= lavc_param_vismv; |
12670 | 336 avctx->skip_top = lavc_param_skip_top; |
337 avctx->skip_bottom= lavc_param_skip_bottom; | |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
338 if(lavc_param_lowres_str != NULL) |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
339 { |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
340 sscanf(lavc_param_lowres_str, "%d,%d", &lavc_param_lowres, &lowres_w); |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
341 if(lavc_param_lowres < 1 || lavc_param_lowres > 16 || (lowres_w > 0 && avctx->width < lowres_w)) |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
342 lavc_param_lowres = 0; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
343 avctx->lowres = lavc_param_lowres; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
344 } |
15986 | 345 avctx->skip_loop_filter = str2AVDiscard(lavc_param_skip_loop_filter_str); |
346 avctx->skip_idct = str2AVDiscard(lavc_param_skip_idct_str); | |
347 avctx->skip_frame = str2AVDiscard(lavc_param_skip_frame_str); | |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
348 |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
349 if(lavc_avopt){ |
33255
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
350 if (parse_avopts(avctx, lavc_avopt) < 0 && |
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
351 (!lavc_codec->priv_class || |
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
352 parse_avopts(avctx->priv_data, lavc_avopt) < 0)) { |
28525 | 353 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavc_avopt); |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
354 uninit(sh); |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
355 return 0; |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
356 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
357 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
358 |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
359 skip_idct = avctx->skip_idct; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
360 skip_frame = avctx->skip_frame; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
361 |
28525 | 362 mp_dbg(MSGT_DECVIDEO, MSGL_DBG2, "libavcodec.size: %d x %d\n", avctx->width, avctx->height); |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
363 switch (sh->format) { |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
364 case mmioFOURCC('S','V','Q','3'): |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
365 /* SVQ3 extradata can show up as sh->ImageDesc if demux_mov is used, or |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
366 in the phony AVI header if demux_lavf is used. The first case is |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
367 handled here; the second case falls through to the next section. */ |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
368 if (sh->ImageDesc) { |
28525 | 369 avctx->extradata_size = (*(int *)sh->ImageDesc) - sizeof(int); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
370 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
28525 | 371 memcpy(avctx->extradata, ((int *)sh->ImageDesc)+1, avctx->extradata_size); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
372 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
373 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
374 /* fallthrough */ |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
375 |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
376 case mmioFOURCC('A','V','R','n'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
377 case mmioFOURCC('M','J','P','G'): |
5939 | 378 /* AVRn stores huffman table in AVI header */ |
379 /* Pegasus MJPEG stores it also in AVI header, but it uses the common | |
380 MJPG fourcc :( */ | |
32105 | 381 if (!sh->bih || sh->bih->biSize <= sizeof(*sh->bih)) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
382 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
383 avctx->flags |= CODEC_FLAG_EXTERN_HUFF; |
32105 | 384 avctx->extradata_size = sh->bih->biSize-sizeof(*sh->bih); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
385 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
386 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
5939 | 387 |
388 #if 0 | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
389 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
390 int x; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
391 uint8_t *p = avctx->extradata; |
28509 | 392 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
393 for (x=0; x<avctx->extradata_size; x++) |
28525 | 394 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "[%x] ", p[x]); |
395 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "\n"); | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
396 } |
5939 | 397 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
398 break; |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
399 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
400 case mmioFOURCC('R', 'V', '1', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
401 case mmioFOURCC('R', 'V', '1', '3'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
402 case mmioFOURCC('R', 'V', '2', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
403 case mmioFOURCC('R', 'V', '3', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
404 case mmioFOURCC('R', 'V', '4', '0'): |
20920 | 405 if(sh->bih->biSize<sizeof(*sh->bih)+8){ |
7574
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
406 /* only 1 packet per frame & sub_id from fourcc */ |
20920 | 407 avctx->extradata_size= 8; |
408 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
28525 | 409 ((uint32_t *)avctx->extradata)[0] = 0; |
410 ((uint32_t *)avctx->extradata)[1] = | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
411 (sh->format == mmioFOURCC('R', 'V', '1', '3')) ? 0x10003001 : 0x10000000; |
7574
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
412 } else { |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
413 /* has extra slice header (demux_rm or rm->avi streamcopy) */ |
32105 | 414 avctx->extradata_size = sh->bih->biSize-sizeof(*sh->bih); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
415 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
416 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
417 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
418 avctx->sub_id= AV_RB32(avctx->extradata+4); |
7573 | 419 |
7126 | 420 // printf("%X %X %d %d\n", extrahdr[0], extrahdr[1]); |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
421 break; |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
422 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
423 default: |
32105 | 424 if (!sh->bih || sh->bih->biSize <= sizeof(*sh->bih)) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
425 break; |
32105 | 426 avctx->extradata_size = sh->bih->biSize-sizeof(*sh->bih); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
427 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
428 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
429 break; |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
430 } |
11420 | 431 /* Pass palette to codec */ |
432 if (sh->bih && (sh->bih->biBitCount <= 8)) { | |
33168 | 433 avctx->palctrl = av_mallocz(sizeof(AVPaletteControl)); |
11420 | 434 avctx->palctrl->palette_changed = 1; |
32105 | 435 if (sh->bih->biSize-sizeof(*sh->bih)) |
11420 | 436 /* Palette size in biSize */ |
437 memcpy(avctx->palctrl->palette, sh->bih+1, | |
32105 | 438 FFMIN(sh->bih->biSize-sizeof(*sh->bih), AVPALETTE_SIZE)); |
11420 | 439 else |
440 /* Palette size in biClrUsed */ | |
441 memcpy(avctx->palctrl->palette, sh->bih+1, | |
21531
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
21507
diff
changeset
|
442 FFMIN(sh->bih->biClrUsed * 4, AVPALETTE_SIZE)); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
443 } |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
444 |
8264 | 445 if(sh->bih) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
446 avctx->bits_per_coded_sample= sh->bih->biBitCount; |
7126 | 447 |
33027
55de45e1d943
Do not use deprecated avcodec_thread_init, it is broken and does nothing currently.
reimar
parents:
33010
diff
changeset
|
448 avctx->thread_count = lavc_param_threads; |
33028 | 449 avctx->thread_type = FF_THREAD_FRAME | FF_THREAD_SLICE; |
33040
a6be6a134ac0
Fix XVMC decoding (avcodec_open would fail if thread_count is set)
reimar
parents:
33032
diff
changeset
|
450 if(lavc_codec->capabilities & CODEC_CAP_HWACCEL) |
a6be6a134ac0
Fix XVMC decoding (avcodec_open would fail if thread_count is set)
reimar
parents:
33032
diff
changeset
|
451 // HACK around badly placed checks in mpeg_mc_decode_init |
a6be6a134ac0
Fix XVMC decoding (avcodec_open would fail if thread_count is set)
reimar
parents:
33032
diff
changeset
|
452 set_format_params(avctx, PIX_FMT_XVMC_MPEG2_IDCT); |
a6be6a134ac0
Fix XVMC decoding (avcodec_open would fail if thread_count is set)
reimar
parents:
33032
diff
changeset
|
453 |
4952 | 454 /* open it */ |
5457
f248c9e86423
config vo only if aspect really changed and width&&height isn't changed (if w||h changes, we set it later)
alex
parents:
5331
diff
changeset
|
455 if (avcodec_open(avctx, lavc_codec) < 0) { |
28525 | 456 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantOpenCodec); |
21498 | 457 uninit(sh); |
4952 | 458 return 0; |
459 } | |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
460 // this is necessary in case get_format was never called and init_vo is |
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
461 // too late e.g. for H.264 VDPAU |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
462 set_format_params(avctx, avctx->pix_fmt); |
28525 | 463 mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n"); |
464 return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12); | |
4952 | 465 } |
466 | |
467 // uninit driver | |
468 static void uninit(sh_video_t *sh){ | |
5280 | 469 vd_ffmpeg_ctx *ctx = sh->context; |
470 AVCodecContext *avctx = ctx->avctx; | |
28509 | 471 |
8411 | 472 if(lavc_param_vstats){ |
473 int i; | |
474 for(i=1; i<32; i++){ | |
28525 | 475 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "QP: %d, count: %d\n", i, ctx->qp_stat[i]); |
8411 | 476 } |
28525 | 477 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_ArithmeticMeanOfQP, |
8413 | 478 ctx->qp_sum / avctx->coded_frame->coded_picture_number, |
479 1.0/(ctx->inv_qp_sum / avctx->coded_frame->coded_picture_number) | |
8411 | 480 ); |
481 } | |
5280 | 482 |
22091 | 483 if (avctx) { |
22092 | 484 if (avctx->codec && avcodec_close(avctx) < 0) |
28525 | 485 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec); |
5939 | 486 |
22092 | 487 av_freep(&avctx->extradata); |
488 av_freep(&avctx->palctrl); | |
489 av_freep(&avctx->slice_offset); | |
22091 | 490 } |
5939 | 491 |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
492 av_freep(&avctx); |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
493 av_freep(&ctx->pic); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32507
diff
changeset
|
494 free(ctx); |
4952 | 495 } |
496 | |
5482 | 497 static void draw_slice(struct AVCodecContext *s, |
29914
67b386883561
Add const to draw_slice argument to match what FFmpeg expects for draw_horiz_band.
reimar
parents:
29879
diff
changeset
|
498 const AVFrame *src, int offset[4], |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
499 int y, int type, int height){ |
28525 | 500 sh_video_t *sh = s->opaque; |
29059
48ba0e64e754
Use MP_MAX_PLANES as size of arrays passed to mpcodecs_draw_slice.
reimar
parents:
28956
diff
changeset
|
501 uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; |
30588
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
502 int strides[MP_MAX_PLANES] = {src->linesize[0], src->linesize[1], src->linesize[2]}; |
24142 | 503 #if 0 |
6740 | 504 int start=0, i; |
10449 | 505 int width= s->width; |
13489
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
506 int skip_stride= ((width<<lavc_param_lowres)+15)>>4; |
9400 | 507 uint8_t *skip= &s->coded_frame->mbskip_table[(y>>4)*skip_stride]; |
8413 | 508 int threshold= s->coded_frame->age; |
6740 | 509 if(s->pict_type!=B_TYPE){ |
28509 | 510 for(i=0; i*16<width+16; i++){ |
6740 | 511 if(i*16>=width || skip[i]>=threshold){ |
512 if(start==i) start++; | |
513 else{ | |
28509 | 514 uint8_t *src2[3]= {src[0] + start*16, |
515 src[1] + start*8, | |
6740 | 516 src[2] + start*8}; |
517 //printf("%2d-%2d x %d\n", start, i, y); | |
28525 | 518 mpcodecs_draw_slice (sh, src2, stride, (i-start)*16, height, start*16, y); |
6740 | 519 start= i+1; |
520 } | |
28509 | 521 } |
6740 | 522 } |
523 }else | |
524 #endif | |
30588
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
525 if (height < 0) |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
526 { |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
527 int i; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
528 height = -height; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
529 y -= height; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
530 for (i = 0; i < MP_MAX_PLANES; i++) |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
531 { |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
532 strides[i] = -strides[i]; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
533 source[i] -= strides[i]; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
534 } |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
535 } |
15683 | 536 if (y < sh->disp_h) { |
31270 | 537 height = FFMIN(height, sh->disp_h-y); |
538 mpcodecs_draw_slice (sh, source, strides, sh->disp_w, height, 0, y); | |
15683 | 539 } |
5482 | 540 } |
4952 | 541 |
10436 | 542 |
12006 | 543 static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){ |
5280 | 544 vd_ffmpeg_ctx *ctx = sh->context; |
545 AVCodecContext *avctx = ctx->avctx; | |
11194 | 546 float aspect= av_q2d(avctx->sample_aspect_ratio) * avctx->width / avctx->height; |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
547 int width, height; |
4952 | 548 |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
549 width = avctx->width; |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
550 height = avctx->height; |
15569 | 551 |
552 // HACK! | |
553 // if sh->ImageDesc is non-NULL, it means we decode QuickTime(tm) video. | |
554 // use dimensions from BIH to avoid black borders at the right and bottom. | |
555 if (sh->bih && sh->ImageDesc) { | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
556 width = sh->bih->biWidth>>lavc_param_lowres; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
557 height = sh->bih->biHeight>>lavc_param_lowres; |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
558 } |
28509 | 559 |
11414 | 560 // it is possible another vo buffers to be used after vo config() |
561 // lavc reset its buffers on width/heigh change but not on aspect change!!! | |
22277
de3ca43ae51e
reinit the vo when aspect ratio changes; patch by C.E. Hoyos approved by Michael
nicodvb
parents:
22222
diff
changeset
|
562 if (av_cmp_q(avctx->sample_aspect_ratio, ctx->last_sample_aspect_ratio) || |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
563 width != sh->disp_w || |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
564 height != sh->disp_h || |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
565 pix_fmt != ctx->pix_fmt || |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
566 !ctx->vo_initialized) |
5280 | 567 { |
32603
02830ab7afb7
Reset ctx->vo_initialized to 0 on a resolution change.
reimar
parents:
32592
diff
changeset
|
568 ctx->vo_initialized = 0; |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
569 // this is a special-case HACK for MPEG-1/2 VDPAU that uses neither get_format nor |
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
570 // sets the value correctly in avcodec_open. |
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
571 set_format_params(avctx, avctx->pix_fmt); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
572 mp_msg(MSGT_DECVIDEO, MSGL_V, "[ffmpeg] aspect_ratio: %f\n", aspect); |
32439
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
573 |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
574 // Do not overwrite s->aspect on the first call, so that a container |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
575 // aspect if available is preferred. |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
576 // But set it even if the sample aspect did not change, since a |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
577 // resolution change can cause an aspect change even if the |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
578 // _sample_ aspect is unchanged. |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
579 if (sh->aspect == 0 || ctx->last_sample_aspect_ratio.den) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
580 sh->aspect = aspect; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
581 ctx->last_sample_aspect_ratio = avctx->sample_aspect_ratio; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
582 sh->disp_w = width; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
583 sh->disp_h = height; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
584 ctx->pix_fmt = pix_fmt; |
28527 | 585 ctx->best_csp = pixfmt2imgfmt(pix_fmt); |
28525 | 586 if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp)) |
28523 | 587 return -1; |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
588 ctx->vo_initialized = 1; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
589 } |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
590 return 0; |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
591 } |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
592 |
8413 | 593 static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ |
28525 | 594 sh_video_t *sh = avctx->opaque; |
6734 | 595 vd_ffmpeg_ctx *ctx = sh->context; |
28525 | 596 mp_image_t *mpi=NULL; |
33010
fafbc46915db
Change MP_IMGFLAG_ACCEPT_STRIDE to MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE as various
zuxy
parents:
32768
diff
changeset
|
597 int flags= MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; |
6737 | 598 int type= MP_IMGTYPE_IPB; |
8339 | 599 int width= avctx->width; |
600 int height= avctx->height; | |
33200
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
601 // special case to handle reget_buffer without buffer hints |
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
602 if (pic->opaque && pic->data[0] && !pic->buffer_hints) |
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
603 return 0; |
29879
5dbbcdb2fb47
Use avcodec_align_dimensions to appropriately align width and height in
reimar
parents:
29842
diff
changeset
|
604 avcodec_align_dimensions(avctx, &width, &height); |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
605 //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); |
6738 | 606 |
28523 | 607 if (pic->buffer_hints) { |
28525 | 608 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints); |
28523 | 609 type = MP_IMGTYPE_TEMP; |
610 if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE) | |
611 flags |= MP_IMGFLAG_READABLE; | |
612 if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) { | |
613 type = MP_IMGTYPE_STATIC; | |
614 flags |= MP_IMGFLAG_PRESERVE; | |
615 } | |
616 if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { | |
617 type = MP_IMGTYPE_STATIC; | |
618 flags |= MP_IMGFLAG_PRESERVE; | |
619 } | |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
620 flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ? |
28523 | 621 MP_IMGFLAG_DRAW_CALLBACK:0; |
28525 | 622 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n"); |
28523 | 623 } else { |
624 if(!pic->reference){ | |
625 ctx->b_count++; | |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
626 flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ? |
28523 | 627 MP_IMGFLAG_DRAW_CALLBACK:0; |
628 }else{ | |
629 ctx->ip_count++; | |
630 flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE | |
631 | (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0); | |
632 } | |
11420 | 633 } |
8339 | 634 |
28525 | 635 if(init_vo(sh, avctx->pix_fmt) < 0){ |
9991 | 636 avctx->release_buffer= avcodec_default_release_buffer; |
637 avctx->get_buffer= avcodec_default_get_buffer; | |
33199
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
638 avctx->reget_buffer= avcodec_default_reget_buffer; |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
639 if (pic->data[0]) |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
640 release_buffer(avctx, pic); |
9991 | 641 return avctx->get_buffer(avctx, pic); |
642 } | |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
643 |
32488 | 644 if (IMGFMT_IS_HWACCEL(ctx->best_csp)) { |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
645 type = MP_IMGTYPE_NUMBERED | (0xffff << 16); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
646 } else |
28523 | 647 if (!pic->buffer_hints) { |
648 if(ctx->b_count>1 || ctx->ip_count>2){ | |
649 mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_DRIFailure); | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
650 |
28523 | 651 ctx->do_dr1=0; //FIXME |
652 avctx->get_buffer= avcodec_default_get_buffer; | |
33199
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
653 avctx->reget_buffer= avcodec_default_reget_buffer; |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
654 if (pic->data[0]) |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
655 release_buffer(avctx, pic); |
28523 | 656 return avctx->get_buffer(avctx, pic); |
657 } | |
658 | |
32613
e006d3eb4e60
Treat non-ref frames like B-frames even if has_b_frames is not set and
reimar
parents:
32603
diff
changeset
|
659 if(avctx->has_b_frames || ctx->b_count){ |
28523 | 660 type= MP_IMGTYPE_IPB; |
661 }else{ | |
662 type= MP_IMGTYPE_IP; | |
663 } | |
28525 | 664 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n"); |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
665 } |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
666 |
30074 | 667 if (ctx->best_csp == IMGFMT_RGB8 || ctx->best_csp == IMGFMT_BGR8) |
668 flags |= MP_IMGFLAG_RGB_PALETTE; | |
29879
5dbbcdb2fb47
Use avcodec_align_dimensions to appropriately align width and height in
reimar
parents:
29842
diff
changeset
|
669 mpi= mpcodecs_get_image(sh, type, flags, width, height); |
28608
7a759aa746b6
Handle mpcodecs_get_image returning NULL, FFmpeg most of the time handles
reimar
parents:
28601
diff
changeset
|
670 if (!mpi) return -1; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
671 |
11000 | 672 // ok, let's see what did we get: |
28525 | 673 if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
674 !(mpi->flags&MP_IMGFLAG_DIRECT)){ |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
675 // nice, filter/vo likes draw_callback :) |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
676 avctx->draw_horiz_band= draw_slice; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
677 } else |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
678 avctx->draw_horiz_band= NULL; |
32488 | 679 if(IMGFMT_IS_HWACCEL(mpi->imgfmt)) { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
680 avctx->draw_horiz_band= draw_slice; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
681 } |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
682 #if CONFIG_XVMC |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
683 if(IMGFMT_IS_XVMC(mpi->imgfmt)) { |
28568
1a90167d9f0e
The xvmc_pixfmt_render structure was renamed to xvmc_pix_fmt in FFmpeg.
diego
parents:
28566
diff
changeset
|
684 struct xvmc_pix_fmt *render = mpi->priv; //same as data[2] |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
685 if(!avctx->xvmc_acceleration) { |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
686 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_McGetBufferShouldWorkOnlyWithXVMC); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
687 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
688 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
689 // return -1;//!!fixme check error conditions in ffmpeg |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
690 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
691 if(!(mpi->flags & MP_IMGFLAG_DIRECT)) { |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
692 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
693 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
694 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
695 // return -1;//!!fixme check error conditions in ffmpeg |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
696 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
697 if(mp_msg_test(MSGT_DECVIDEO, MSGL_DBG5)) |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
698 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::get_buffer (xvmc render=%p)\n", render); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
699 assert(render != 0); |
28573
67d2779b13ec
The AV_XVMC_RENDER_MAGIC constant was renamed to AV_XVMC_ID in FFmpeg.
diego
parents:
28572
diff
changeset
|
700 assert(render->xvmc_id == AV_XVMC_ID); |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
701 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
702 #endif |
11420 | 703 |
8339 | 704 pic->data[0]= mpi->planes[0]; |
705 pic->data[1]= mpi->planes[1]; | |
706 pic->data[2]= mpi->planes[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
707 pic->data[3]= mpi->planes[3]; |
8595 | 708 |
28509 | 709 #if 0 |
8595 | 710 assert(mpi->width >= ((width +align)&(~align))); |
711 assert(mpi->height >= ((height+align)&(~align))); | |
712 assert(mpi->stride[0] >= mpi->width); | |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
713 if(mpi->imgfmt==IMGFMT_I420 || mpi->imgfmt==IMGFMT_YV12 || mpi->imgfmt==IMGFMT_IYUV){ |
8586
88f2362f1291
5l - fixed asserts... mpi->width is allocated width, not the effective one
arpi
parents:
8510
diff
changeset
|
714 const int y_size= mpi->stride[0] * (mpi->h-1) + mpi->w; |
88f2362f1291
5l - fixed asserts... mpi->width is allocated width, not the effective one
arpi
parents:
8510
diff
changeset
|
715 const int c_size= mpi->stride[1] * ((mpi->h>>1)-1) + (mpi->w>>1); |
28509 | 716 |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
717 assert(mpi->planes[0] > mpi->planes[1] || mpi->planes[0] + y_size <= mpi->planes[1]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
718 assert(mpi->planes[0] > mpi->planes[2] || mpi->planes[0] + y_size <= mpi->planes[2]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
719 assert(mpi->planes[1] > mpi->planes[0] || mpi->planes[1] + c_size <= mpi->planes[0]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
720 assert(mpi->planes[1] > mpi->planes[2] || mpi->planes[1] + c_size <= mpi->planes[2]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
721 assert(mpi->planes[2] > mpi->planes[0] || mpi->planes[2] + c_size <= mpi->planes[0]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
722 assert(mpi->planes[2] > mpi->planes[1] || mpi->planes[2] + c_size <= mpi->planes[1]); |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
723 } |
8595 | 724 #endif |
6734 | 725 |
8339 | 726 /* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames |
727 * lavc will check that and die with an error message, if its not true | |
728 */ | |
729 pic->linesize[0]= mpi->stride[0]; | |
730 pic->linesize[1]= mpi->stride[1]; | |
731 pic->linesize[2]= mpi->stride[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
732 pic->linesize[3]= mpi->stride[3]; |
6734 | 733 |
8339 | 734 pic->opaque = mpi; |
6742
93bce3460e2a
fallback to slices, if dr1 fails (bug found by kabi)
michael
parents:
6740
diff
changeset
|
735 //printf("%X\n", (int)mpi->planes[0]); |
6869 | 736 #if 0 |
737 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
738 printf("D"); | |
739 else if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) | |
740 printf("S"); | |
741 else | |
742 printf("."); | |
743 #endif | |
8339 | 744 if(pic->reference){ |
745 pic->age= ctx->ip_age[0]; | |
28509 | 746 |
8339 | 747 ctx->ip_age[0]= ctx->ip_age[1]+1; |
748 ctx->ip_age[1]= 1; | |
749 ctx->b_age++; | |
750 }else{ | |
751 pic->age= ctx->b_age; | |
28509 | 752 |
8339 | 753 ctx->ip_age[0]++; |
754 ctx->ip_age[1]++; | |
755 ctx->b_age=1; | |
756 } | |
8411 | 757 pic->type= FF_BUFFER_TYPE_USER; |
7928 | 758 return 0; |
8339 | 759 } |
760 | |
8413 | 761 static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){ |
28525 | 762 mp_image_t *mpi= pic->opaque; |
763 sh_video_t *sh = avctx->opaque; | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
764 vd_ffmpeg_ctx *ctx = sh->context; |
8339 | 765 int i; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
766 |
28509 | 767 //printf("release buffer %d %d %d\n", mpi ? mpi->flags&MP_IMGFLAG_PRESERVE : -99, ctx->ip_count, ctx->b_count); |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
768 |
28523 | 769 if(ctx->ip_count <= 2 && ctx->b_count<=1){ |
770 if(mpi->flags&MP_IMGFLAG_PRESERVE) | |
771 ctx->ip_count--; | |
772 else | |
773 ctx->b_count--; | |
774 } | |
11420 | 775 |
28554 | 776 if (mpi) { |
777 // Palette support: free palette buffer allocated in get_buffer | |
778 if (mpi->bpp == 8) | |
779 av_freep(&mpi->planes[1]); | |
28555 | 780 // release mpi (in case MPI_IMGTYPE_NUMBERED is used, e.g. for VDPAU) |
28956
6d0da4fd4544
Allow to use vdpau temporal deinterlacers with hardware accelerated decoding.
cehoyos
parents:
28766
diff
changeset
|
781 mpi->usage_count--; |
28553
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
782 } |
11420 | 783 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
784 if(pic->type!=FF_BUFFER_TYPE_USER){ |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
785 avcodec_default_release_buffer(avctx, pic); |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
786 return; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
787 } |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
788 |
8339 | 789 for(i=0; i<4; i++){ |
790 pic->data[i]= NULL; | |
791 } | |
792 //printf("R%X %X\n", pic->linesize[0], pic->data[0]); | |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
793 } |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
794 |
7573 | 795 // copypaste from demux_real.c - it should match to get it working! |
796 //FIXME put into some header | |
797 typedef struct dp_hdr_s { | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
798 uint32_t chunks; // number of chunks |
7573 | 799 uint32_t timestamp; // timestamp from packet header |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
800 uint32_t len; // length of actual data |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
801 uint32_t chunktab; // offset to chunk offset array |
7573 | 802 } dp_hdr_t; |
803 | |
31520
9f934200bf9e
Replace HAVE_BIGENDIAN #ifdef around swap_palette() by av_unused attribute.
diego
parents:
31518
diff
changeset
|
804 static av_unused void swap_palette(void *pal) |
30555
ad6740b58b0d
libmpcodecs: Mark functions not used outside of their files as static.
diego
parents:
30504
diff
changeset
|
805 { |
22076 | 806 int i; |
807 uint32_t *p = pal; | |
808 for (i = 0; i < AVPALETTE_COUNT; i++) | |
809 p[i] = le2me_32(p[i]); | |
810 } | |
13190 | 811 |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
812 // decode a frame |
28525 | 813 static mp_image_t *decode(sh_video_t *sh, void *data, int len, int flags){ |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
814 int got_picture=0; |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
815 int ret; |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
816 vd_ffmpeg_ctx *ctx = sh->context; |
8413 | 817 AVFrame *pic= ctx->pic; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
818 AVCodecContext *avctx = ctx->avctx; |
28525 | 819 mp_image_t *mpi=NULL; |
6737 | 820 int dr1= ctx->do_dr1; |
29298
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
821 AVPacket pkt; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
822 |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
823 if(len<=0) return NULL; // skipped frame |
6734 | 824 |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
825 //ffmpeg interlace (mpeg2) bug have been fixed. no need of -noslices |
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
826 if (!dr1) |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
827 avctx->draw_horiz_band=NULL; |
25962 | 828 if(ctx->vo_initialized && !(flags&3) && !dr1){ |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
829 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, MP_IMGFLAG_PRESERVE | |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
830 (ctx->do_slices?MP_IMGFLAG_DRAW_CALLBACK:0), |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
831 sh->disp_w, sh->disp_h); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
832 if(mpi && mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){ |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
833 // vd core likes slices! |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
834 avctx->draw_horiz_band=draw_slice; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
835 } |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
836 } |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
837 |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
838 avctx->skip_idct = skip_idct; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
839 avctx->skip_frame = skip_frame; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
840 |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
841 if (flags&3) { |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
842 avctx->skip_frame = AVDISCARD_NONREF; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
843 if (flags&2) |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
844 avctx->skip_idct = AVDISCARD_ALL; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
845 } |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
846 |
16497
182794778785
print the first 16 bytes of frame data with -v -v, helps detect when
reimar
parents:
15986
diff
changeset
|
847 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "vd_ffmpeg data: %04x, %04x, %04x, %04x\n", |
182794778785
print the first 16 bytes of frame data with -v -v, helps detect when
reimar
parents:
15986
diff
changeset
|
848 ((int *)data)[0], ((int *)data)[1], ((int *)data)[2], ((int *)data)[3]); |
29298
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
849 av_init_packet(&pkt); |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
850 pkt.data = data; |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
851 pkt.size = len; |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
852 // HACK: make PNGs decode normally instead of as CorePNG delta frames |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32686
diff
changeset
|
853 pkt.flags = AV_PKT_FLAG_KEY; |
29298
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
854 ret = avcodec_decode_video2(avctx, pic, &got_picture, &pkt); |
13190 | 855 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
856 dr1= ctx->do_dr1; |
28525 | 857 if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n"); |
9547 | 858 //printf("repeat: %d\n", pic->repeat_pict); |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
859 //-- vstats generation |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
860 while(lavc_param_vstats){ // always one time loop |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
861 static FILE *fvstats=NULL; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
862 char filename[20]; |
6834
2d7dfcc79651
Fix overall frametime overflow, hopefully long long int is portable. (untested, will test tomorrow)
atmos4
parents:
6833
diff
changeset
|
863 static long long int all_len=0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
864 static int frame_number=0; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
865 static double all_frametime=0.0; |
8413 | 866 AVFrame *pic= avctx->coded_frame; |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
867 double quality=0.0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
868 |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
869 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
870 time_t today2; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
871 struct tm *today; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
872 today2 = time(NULL); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
873 today = localtime(&today2); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
874 sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour, |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
875 today->tm_min, today->tm_sec); |
28525 | 876 fvstats = fopen(filename, "w"); |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
877 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
878 perror("fopen"); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
879 lavc_param_vstats=0; // disable block |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
880 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
881 /*exit(1);*/ |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
882 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
883 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
884 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
885 // average MB quantizer |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
886 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
887 int x, y; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
888 int w = ((avctx->width << lavc_param_lowres)+15) >> 4; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
889 int h = ((avctx->height << lavc_param_lowres)+15) >> 4; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
890 int8_t *q = pic->qscale_table; |
28525 | 891 for(y = 0; y < h; y++) { |
892 for(x = 0; x < w; x++) | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
893 quality += (double)*(q+x); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
894 q += pic->qstride; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
895 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
896 quality /= w * h; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
897 } |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
898 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
899 all_len+=len; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
900 all_frametime+=sh->frametime; |
8411 | 901 fprintf(fvstats, "frame= %5d q= %2.2f f_size= %6d s_size= %8.0fkB ", |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
902 ++frame_number, quality, len, (double)all_len/1024); |
6833
a709a7662cd1
Add type= and fix a minor typing difference from ffmpeg
atmos4
parents:
6828
diff
changeset
|
903 fprintf(fvstats, "time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
904 all_frametime, (double)(len*8)/sh->frametime/1000.0, |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
905 (double)(all_len*8)/all_frametime/1000.0); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
906 switch(pic->pict_type){ |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
907 case FF_I_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
908 fprintf(fvstats, "type= I\n"); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
909 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
910 case FF_P_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
911 fprintf(fvstats, "type= P\n"); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
912 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
913 case FF_S_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
914 fprintf(fvstats, "type= S\n"); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
915 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
916 case FF_B_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
917 fprintf(fvstats, "type= B\n"); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
918 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
919 default: |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
920 fprintf(fvstats, "type= ? (%d)\n", pic->pict_type); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
921 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
922 } |
28509 | 923 |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
924 ctx->qp_stat[(int)(quality+0.5)]++; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
925 ctx->qp_sum += quality; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
926 ctx->inv_qp_sum += 1.0/(double)quality; |
28509 | 927 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
928 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
929 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
930 //-- |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
931 |
31953 | 932 if(!got_picture) { |
933 if (avctx->codec->id == CODEC_ID_H264) | |
934 return &mpi_no_picture; // H.264 first field only | |
935 else | |
936 return NULL; // skipped image | |
937 } | |
6738 | 938 |
28525 | 939 if(init_vo(sh, avctx->pix_fmt) < 0) return NULL; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
940 |
8339 | 941 if(dr1 && pic->opaque){ |
28525 | 942 mpi= (mp_image_t *)pic->opaque; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
943 } |
28509 | 944 |
5482 | 945 if(!mpi) |
4952 | 946 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, MP_IMGFLAG_PRESERVE, |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
947 avctx->width, avctx->height); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
948 if(!mpi){ // temporary! |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
949 mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_CouldntAllocateImageForCodec); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
950 return NULL; |
4952 | 951 } |
28509 | 952 |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
953 if(!dr1){ |
8339 | 954 mpi->planes[0]=pic->data[0]; |
955 mpi->planes[1]=pic->data[1]; | |
956 mpi->planes[2]=pic->data[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
957 mpi->planes[3]=pic->data[3]; |
8339 | 958 mpi->stride[0]=pic->linesize[0]; |
959 mpi->stride[1]=pic->linesize[1]; | |
960 mpi->stride[2]=pic->linesize[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
961 mpi->stride[3]=pic->linesize[3]; |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
962 } |
28509 | 963 |
11372
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
964 if (!mpi->planes[0]) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
965 return NULL; |
4952 | 966 |
32507
97738e6f82dc
Use IMGFMT to compare instead of PIX_FMT to avoid issues
reimar
parents:
32488
diff
changeset
|
967 if(ctx->best_csp == IMGFMT_422P && mpi->chroma_y_shift==1){ |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
968 // we have 422p but user wants 420p |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
969 mpi->stride[1]*=2; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
970 mpi->stride[2]*=2; |
4952 | 971 } |
28509 | 972 |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29298
diff
changeset
|
973 #if HAVE_BIGENDIAN |
22076 | 974 // FIXME: this might cause problems for buffers with FF_BUFFER_HINTS_PRESERVE |
975 if (mpi->bpp == 8) | |
976 swap_palette(mpi->planes[1]); | |
977 #endif | |
6665 | 978 /* to comfirm with newer lavc style */ |
8339 | 979 mpi->qscale =pic->qscale_table; |
980 mpi->qstride=pic->qstride; | |
981 mpi->pict_type=pic->pict_type; | |
9925
420640a0f6d0
passing qscale_type around so the pp code can fix the mpeg2 <<1 thing
michael
parents:
9865
diff
changeset
|
982 mpi->qscale_type= pic->qscale_type; |
11669
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
983 mpi->fields = MP_IMGFIELD_ORDERED; |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
984 if(pic->interlaced_frame) mpi->fields |= MP_IMGFIELD_INTERLACED; |
28509 | 985 if(pic->top_field_first ) mpi->fields |= MP_IMGFIELD_TOP_FIRST; |
11992
d8890a065727
vd_ffmpeg to set repeat-first-field patch by (Zoltan Hidvegi <mplayer at hzoli do 2y dot net>)
michael
parents:
11977
diff
changeset
|
986 if(pic->repeat_pict == 1) mpi->fields |= MP_IMGFIELD_REPEAT_FIRST; |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
987 |
4952 | 988 return mpi; |
989 } | |
990 | |
28525 | 991 static enum PixelFormat get_format(struct AVCodecContext *avctx, |
992 const enum PixelFormat *fmt){ | |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
993 enum PixelFormat selected_format; |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
994 int imgfmt; |
28525 | 995 sh_video_t *sh = avctx->opaque; |
28523 | 996 int i; |
12006 | 997 |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
998 for(i=0;fmt[i]!=PIX_FMT_NONE;i++){ |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
999 imgfmt = pixfmt2imgfmt(fmt[i]); |
32488 | 1000 if(!IMGFMT_IS_HWACCEL(imgfmt)) continue; |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1001 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i); |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1002 if(init_vo(sh, fmt[i]) >= 0) { |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1003 break; |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1004 } |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1005 } |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
1006 selected_format = fmt[i]; |
33043
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
1007 if (selected_format == PIX_FMT_NONE) |
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
1008 selected_format = avcodec_default_get_format(avctx, fmt); |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
1009 set_format_params(avctx, selected_format); |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
1010 return selected_format; |
12006 | 1011 } |