Mercurial > mplayer.hg
annotate libmpcodecs/vd_ffmpeg.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | 6d0da4fd4544 |
children | 48ba0e64e754 |
rev | line source |
---|---|
4952 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <assert.h> | |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
4 #include <time.h> |
4952 | 5 |
6 #include "config.h" | |
7 #include "mp_msg.h" | |
8 #include "help_mp.h" | |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
9 #include "av_opts.h" |
4952 | 10 |
21372 | 11 #include "libavutil/common.h" |
21457 | 12 #include "libavutil/intreadwrite.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21498
diff
changeset
|
13 #include "mpbswap.h" |
28527 | 14 #include "fmt-conversion.h" |
4952 | 15 |
16 #include "vd_internal.h" | |
17 | |
18 static vd_info_t info = { | |
28523 | 19 "FFmpeg's libavcodec codec family", |
20 "ffmpeg", | |
21 "A'rpi", | |
22 "A'rpi, Michael, Alex", | |
23 "native codecs" | |
4952 | 24 }; |
25 | |
26 LIBVD_EXTERN(ffmpeg) | |
27 | |
28 #include "libavcodec/avcodec.h" | |
29 | |
28412 | 30 #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
|
31 #include "libavcodec/xvmc.h" |
10362 | 32 #endif |
33 | |
25962 | 34 int avcodec_initialized=0; |
4952 | 35 |
5280 | 36 typedef struct { |
37 AVCodecContext *avctx; | |
8413 | 38 AVFrame *pic; |
17973 | 39 enum PixelFormat pix_fmt; |
5482 | 40 int do_slices; |
6734 | 41 int do_dr1; |
25962 | 42 int vo_initialized; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
43 int best_csp; |
8339 | 44 int b_age; |
45 int ip_age[2]; | |
8411 | 46 int qp_stat[32]; |
47 double qp_sum; | |
48 double inv_qp_sum; | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
49 int ip_count; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
50 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
|
51 AVRational last_sample_aspect_ratio; |
5280 | 52 } vd_ffmpeg_ctx; |
53 | |
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
|
54 #include "m_option.h" |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
55 |
8413 | 56 static int get_buffer(AVCodecContext *avctx, AVFrame *pic); |
57 static void release_buffer(AVCodecContext *avctx, AVFrame *pic); | |
28552
d7e1fd202d85
Get rid of mc_render_slice and use the generic draw_slice instead.
reimar
parents:
28548
diff
changeset
|
58 static void draw_slice(struct AVCodecContext *s, AVFrame *src, int offset[4], |
d7e1fd202d85
Get rid of mc_render_slice and use the generic draw_slice instead.
reimar
parents:
28548
diff
changeset
|
59 int y, int type, int height); |
6739 | 60 |
28525 | 61 static enum PixelFormat get_format(struct AVCodecContext *avctx, |
62 const enum PixelFormat *pix_fmt); | |
10362 | 63 |
7722 | 64 static int lavc_param_workaround_bugs= FF_BUG_AUTODETECT; |
65 static int lavc_param_error_resilience=2; | |
66 static int lavc_param_error_concealment=3; | |
26395 | 67 static int lavc_param_gray=0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
68 static int lavc_param_vstats=0; |
7564 | 69 static int lavc_param_idct_algo=0; |
8341 | 70 static int lavc_param_debug=0; |
11702 | 71 static int lavc_param_vismv=0; |
12670 | 72 static int lavc_param_skip_top=0; |
73 static int lavc_param_skip_bottom=0; | |
13230 | 74 static int lavc_param_fast=0; |
13473 | 75 static int lavc_param_lowres=0; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
76 static char *lavc_param_lowres_str=NULL; |
15986 | 77 static char *lavc_param_skip_loop_filter_str = NULL; |
78 static char *lavc_param_skip_idct_str = NULL; | |
79 static char *lavc_param_skip_frame_str = NULL; | |
17080 | 80 static int lavc_param_threads=1; |
17217 | 81 static int lavc_param_bitexact=0; |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
82 static char *lavc_avopt = NULL; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
83 |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
24854
diff
changeset
|
84 const m_option_t lavc_decode_opts_conf[]={ |
28523 | 85 {"bug", &lavc_param_workaround_bugs, CONF_TYPE_INT, CONF_RANGE, -1, 999999, NULL}, |
86 {"er", &lavc_param_error_resilience, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
87 {"gray", &lavc_param_gray, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, | |
88 {"idct", &lavc_param_idct_algo, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
89 {"ec", &lavc_param_error_concealment, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, | |
90 {"vstats", &lavc_param_vstats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
91 {"debug", &lavc_param_debug, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, | |
92 {"vismv", &lavc_param_vismv, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, | |
93 {"st", &lavc_param_skip_top, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, | |
94 {"sb", &lavc_param_skip_bottom, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, | |
95 {"fast", &lavc_param_fast, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG2_FAST, NULL}, | |
96 {"lowres", &lavc_param_lowres_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
97 {"skiploopfilter", &lavc_param_skip_loop_filter_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
98 {"skipidct", &lavc_param_skip_idct_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
99 {"skipframe", &lavc_param_skip_frame_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
100 {"threads", &lavc_param_threads, CONF_TYPE_INT, CONF_RANGE, 1, 8, NULL}, | |
101 {"bitexact", &lavc_param_bitexact, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_BITEXACT, NULL}, | |
102 {"o", &lavc_avopt, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
103 {NULL, NULL, 0, 0, 0, 0, NULL} | |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
104 }; |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
105 |
15986 | 106 static enum AVDiscard str2AVDiscard(char *str) { |
26694 | 107 if (!str) return AVDISCARD_DEFAULT; |
108 if (strcasecmp(str, "none" ) == 0) return AVDISCARD_NONE; | |
109 if (strcasecmp(str, "default") == 0) return AVDISCARD_DEFAULT; | |
110 if (strcasecmp(str, "nonref" ) == 0) return AVDISCARD_NONREF; | |
111 if (strcasecmp(str, "bidir" ) == 0) return AVDISCARD_BIDIR; | |
112 if (strcasecmp(str, "nonkey" ) == 0) return AVDISCARD_NONKEY; | |
113 if (strcasecmp(str, "all" ) == 0) return AVDISCARD_ALL; | |
114 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Unknown discard value %s\n", str); | |
15986 | 115 return AVDISCARD_DEFAULT; |
116 } | |
117 | |
4952 | 118 // to set/get/query special features/parameters |
28525 | 119 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
|
120 vd_ffmpeg_ctx *ctx = sh->context; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
121 AVCodecContext *avctx = ctx->avctx; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
122 switch(cmd){ |
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
123 case VDCTRL_QUERY_FORMAT: |
28523 | 124 { |
28525 | 125 int format =(*((int *)arg)); |
126 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
|
127 // possible conversions: |
28525 | 128 switch(format){ |
6739 | 129 case IMGFMT_YV12: |
130 case IMGFMT_IYUV: | |
131 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
|
132 // "converted" using pointer/stride modification |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
133 if(avctx->pix_fmt==PIX_FMT_YUV420P) return CONTROL_TRUE;// u/v swap |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
134 if(avctx->pix_fmt==PIX_FMT_YUV422P && !ctx->do_dr1) return CONTROL_TRUE;// half stride |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
135 break; |
28412 | 136 #if CONFIG_XVMC |
10452 | 137 case IMGFMT_XVMC_IDCT_MPEG2: |
138 case IMGFMT_XVMC_MOCO_MPEG2: | |
10471 | 139 if(avctx->pix_fmt==PIX_FMT_XVMC_MPEG2_IDCT) return CONTROL_TRUE; |
10452 | 140 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
141 } |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
142 return CONTROL_FALSE; |
28523 | 143 } |
11977
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
144 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
|
145 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
|
146 return CONTROL_TRUE; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
147 case VDCTRL_QUERY_UNSEEN_FRAMES: |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
148 return avctx->has_b_frames + 10; |
10362 | 149 } |
4952 | 150 return CONTROL_UNKNOWN; |
151 } | |
152 | |
28525 | 153 void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) |
20741 | 154 { |
155 static int print_prefix=1; | |
28525 | 156 AVClass *avc= ptr ? *(AVClass **)ptr : NULL; |
20741 | 157 int type= MSGT_FIXME; |
158 int mp_level; | |
159 char buf[256]; | |
160 | |
21242 | 161 switch(level){ |
162 case AV_LOG_DEBUG: mp_level= MSGL_V ; break; | |
163 case AV_LOG_INFO : mp_level= MSGL_INFO; break; | |
164 case AV_LOG_ERROR: mp_level= MSGL_ERR ; break; | |
165 default : mp_level= MSGL_ERR ; break; | |
166 } | |
167 | |
168 if (!mp_msg_test(type, mp_level)) return; | |
169 | |
20741 | 170 if(ptr){ |
171 if(!strcmp(avc->class_name, "AVCodecContext")){ | |
28525 | 172 AVCodecContext *s= ptr; |
20741 | 173 if(s->codec){ |
174 if(s->codec->type == CODEC_TYPE_AUDIO){ | |
175 if(s->codec->decode) | |
176 type= MSGT_DECAUDIO; | |
177 }else if(s->codec->type == CODEC_TYPE_VIDEO){ | |
178 if(s->codec->decode) | |
179 type= MSGT_DECVIDEO; | |
180 } | |
22316
f3d7a1b58a82
cosmetics: Fix some common typos, appropiate --> appropRiate,
diego
parents:
22277
diff
changeset
|
181 //FIXME subtitles, encoders (what msgt for them? there is no appropriate ...) |
20741 | 182 } |
183 }else if(!strcmp(avc->class_name, "AVFormatContext")){ | |
28525 | 184 #if 0 //needs libavformat include FIXME iam too lazy to do this cleanly, probably the whole should be moved out of this file ... |
185 AVFormatContext *s= ptr; | |
20741 | 186 if(s->iformat) |
187 type= MSGT_DEMUXER; | |
188 else if(s->oformat) | |
189 type= MSGT_MUXER; | |
190 #endif | |
191 } | |
192 } | |
193 | |
194 if(print_prefix && avc) { | |
195 mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); | |
196 } | |
197 | |
21243 | 198 print_prefix= strchr(fmt, '\n') != NULL; |
20741 | 199 vsnprintf(buf, sizeof(buf), fmt, vl); |
200 mp_msg(type, mp_level, buf); | |
201 } | |
202 | |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
203 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
|
204 int imgfmt; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
205 imgfmt = pixfmt2imgfmt(fmt); |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
206 if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) { |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
207 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
|
208 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
|
209 ctx->do_dr1 = 1; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
210 ctx->do_slices = 1; |
28732 | 211 avctx->thread_count = 1; |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
212 avctx->get_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
213 avctx->release_buffer = release_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
214 avctx->reget_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
215 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
|
216 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
|
217 avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
218 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
219 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
220 |
4952 | 221 // init driver |
222 static int init(sh_video_t *sh){ | |
5280 | 223 AVCodecContext *avctx; |
224 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
|
225 AVCodec *lavc_codec; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
226 int lowres_w=0; |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
227 int do_vis_debug= lavc_param_vismv || (lavc_param_debug&(FF_DEBUG_VIS_MB_TYPE|FF_DEBUG_VIS_QP)); |
4952 | 228 |
25962 | 229 if(!avcodec_initialized){ |
28523 | 230 avcodec_init(); |
231 avcodec_register_all(); | |
232 avcodec_initialized=1; | |
233 av_log_set_callback(mp_msp_av_log_callback); | |
4952 | 234 } |
5280 | 235 |
236 ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx)); | |
237 if (!ctx) | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
238 return 0; |
5280 | 239 memset(ctx, 0, sizeof(vd_ffmpeg_ctx)); |
28509 | 240 |
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
|
241 lavc_codec = (AVCodec *)avcodec_find_decoder_by_name(sh->codec->dll); |
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
|
242 if(!lavc_codec){ |
28525 | 243 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MissingLAVCcodec, sh->codec->dll); |
21498 | 244 uninit(sh); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
245 return 0; |
4952 | 246 } |
5482 | 247 |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
248 if(vd_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
|
249 ctx->do_slices=1; |
28509 | 250 |
24656
ed5edb202ec2
Disable direct rendering for ROQ video, the buffer management used by
rtogni
parents:
24523
diff
changeset
|
251 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) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
252 ctx->do_dr1=1; |
8339 | 253 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
|
254 ctx->ip_count= ctx->b_count= 0; |
7444 | 255 |
8413 | 256 ctx->pic = avcodec_alloc_frame(); |
7444 | 257 ctx->avctx = avcodec_alloc_context(); |
5280 | 258 avctx = ctx->avctx; |
28601
88bb92d3c5b4
Set avctx->opaque already at init instead of decode so it can be used in
reimar
parents:
28595
diff
changeset
|
259 avctx->opaque = sh; |
6739 | 260 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
261 #if CONFIG_VDPAU |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
262 if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){ |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
263 avctx->get_format = get_format; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
264 } |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
265 #endif /* CONFIG_VDPAU */ |
28412 | 266 #if CONFIG_XVMC |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
267 if(lavc_codec->capabilities & CODEC_CAP_HWACCEL){ |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
17973
diff
changeset
|
268 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedCodec); |
12006 | 269 avctx->get_format= get_format;//for now only this decoder will use it |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
270 // HACK around badly placed checks in mpeg_mc_decode_init |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
271 set_format_params(avctx, PIX_FMT_XVMC_MPEG2_IDCT); |
28563
1993dea41720
Reuse the code for the general do_dr1 case to set get_buffer/release_buffer for XvMC.
reimar
parents:
28560
diff
changeset
|
272 } |
28119 | 273 #endif /* CONFIG_XVMC */ |
6739 | 274 if(ctx->do_dr1){ |
28509 | 275 avctx->flags|= CODEC_FLAG_EMU_EDGE; |
8339 | 276 avctx->get_buffer= get_buffer; |
277 avctx->release_buffer= release_buffer; | |
11526 | 278 avctx->reget_buffer= get_buffer; |
6739 | 279 } |
7303 | 280 |
17217 | 281 avctx->flags|= lavc_param_bitexact; |
28509 | 282 |
5280 | 283 avctx->width = sh->disp_w; |
284 avctx->height= sh->disp_h; | |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
285 avctx->workaround_bugs= lavc_param_workaround_bugs; |
27517 | 286 avctx->error_recognition= lavc_param_error_resilience; |
26395 | 287 if(lavc_param_gray) avctx->flags|= CODEC_FLAG_GRAY; |
13230 | 288 avctx->flags2|= lavc_param_fast; |
9547 | 289 avctx->codec_tag= sh->format; |
10847 | 290 avctx->stream_codec_tag= sh->video.fccHandler; |
7564 | 291 avctx->idct_algo= lavc_param_idct_algo; |
7722 | 292 avctx->error_concealment= lavc_param_error_concealment; |
8341 | 293 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
|
294 if (lavc_param_debug) |
22153 | 295 av_log_set_level(AV_LOG_DEBUG); |
11702 | 296 avctx->debug_mv= lavc_param_vismv; |
12670 | 297 avctx->skip_top = lavc_param_skip_top; |
298 avctx->skip_bottom= lavc_param_skip_bottom; | |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
299 if(lavc_param_lowres_str != NULL) |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
300 { |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
301 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
|
302 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
|
303 lavc_param_lowres = 0; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
304 avctx->lowres = lavc_param_lowres; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
305 } |
15986 | 306 avctx->skip_loop_filter = str2AVDiscard(lavc_param_skip_loop_filter_str); |
307 avctx->skip_idct = str2AVDiscard(lavc_param_skip_idct_str); | |
308 avctx->skip_frame = str2AVDiscard(lavc_param_skip_frame_str); | |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
309 |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
310 if(lavc_avopt){ |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
311 if(parse_avopts(avctx, lavc_avopt) < 0){ |
28525 | 312 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
|
313 uninit(sh); |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
314 return 0; |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
315 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
316 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
317 |
28525 | 318 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
|
319 switch (sh->format) { |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
320 case mmioFOURCC('S','V','Q','3'): |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
321 /* 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
|
322 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
|
323 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
|
324 if (sh->ImageDesc) { |
28525 | 325 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
|
326 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
28525 | 327 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
|
328 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
329 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
330 /* fallthrough */ |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
331 |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
332 case mmioFOURCC('A','V','R','n'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
333 case mmioFOURCC('M','J','P','G'): |
5939 | 334 /* AVRn stores huffman table in AVI header */ |
335 /* Pegasus MJPEG stores it also in AVI header, but it uses the common | |
336 MJPG fourcc :( */ | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
337 if (!sh->bih || sh->bih->biSize <= sizeof(BITMAPINFOHEADER)) |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
338 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
339 avctx->flags |= CODEC_FLAG_EXTERN_HUFF; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
340 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
341 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
|
342 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
5939 | 343 |
344 #if 0 | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
345 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
346 int x; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
347 uint8_t *p = avctx->extradata; |
28509 | 348 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
349 for (x=0; x<avctx->extradata_size; x++) |
28525 | 350 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "[%x] ", p[x]); |
351 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
|
352 } |
5939 | 353 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
354 break; |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
355 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
356 case mmioFOURCC('R', 'V', '1', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
357 case mmioFOURCC('R', 'V', '1', '3'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
358 case mmioFOURCC('R', 'V', '2', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
359 case mmioFOURCC('R', 'V', '3', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
360 case mmioFOURCC('R', 'V', '4', '0'): |
20920 | 361 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
|
362 /* only 1 packet per frame & sub_id from fourcc */ |
20920 | 363 avctx->extradata_size= 8; |
364 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
28525 | 365 ((uint32_t *)avctx->extradata)[0] = 0; |
366 ((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
|
367 (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
|
368 } else { |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
369 /* has extra slice header (demux_rm or rm->avi streamcopy) */ |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
370 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
371 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
|
372 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
|
373 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
374 avctx->sub_id= AV_RB32(avctx->extradata+4); |
7573 | 375 |
7126 | 376 // 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
|
377 break; |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
378 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
379 default: |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
380 if (!sh->bih || sh->bih->biSize <= sizeof(BITMAPINFOHEADER)) |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
381 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
382 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
383 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
|
384 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
|
385 break; |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
386 } |
11420 | 387 /* Pass palette to codec */ |
388 if (sh->bih && (sh->bih->biBitCount <= 8)) { | |
28525 | 389 avctx->palctrl = calloc(1, sizeof(AVPaletteControl)); |
11420 | 390 avctx->palctrl->palette_changed = 1; |
391 if (sh->bih->biSize-sizeof(BITMAPINFOHEADER)) | |
392 /* Palette size in biSize */ | |
393 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
|
394 FFMIN(sh->bih->biSize-sizeof(BITMAPINFOHEADER), AVPALETTE_SIZE)); |
11420 | 395 else |
396 /* Palette size in biClrUsed */ | |
397 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
|
398 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
|
399 } |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
400 |
8264 | 401 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
|
402 avctx->bits_per_coded_sample= sh->bih->biBitCount; |
7126 | 403 |
17080 | 404 if(lavc_param_threads > 1) |
405 avcodec_thread_init(avctx, lavc_param_threads); | |
4952 | 406 /* 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
|
407 if (avcodec_open(avctx, lavc_codec) < 0) { |
28525 | 408 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantOpenCodec); |
21498 | 409 uninit(sh); |
4952 | 410 return 0; |
411 } | |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
412 // 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
|
413 // 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
|
414 set_format_params(avctx, avctx->pix_fmt); |
28525 | 415 mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n"); |
416 return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12); | |
4952 | 417 } |
418 | |
419 // uninit driver | |
420 static void uninit(sh_video_t *sh){ | |
5280 | 421 vd_ffmpeg_ctx *ctx = sh->context; |
422 AVCodecContext *avctx = ctx->avctx; | |
28509 | 423 |
8411 | 424 if(lavc_param_vstats){ |
425 int i; | |
426 for(i=1; i<32; i++){ | |
28525 | 427 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "QP: %d, count: %d\n", i, ctx->qp_stat[i]); |
8411 | 428 } |
28525 | 429 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_ArithmeticMeanOfQP, |
8413 | 430 ctx->qp_sum / avctx->coded_frame->coded_picture_number, |
431 1.0/(ctx->inv_qp_sum / avctx->coded_frame->coded_picture_number) | |
8411 | 432 ); |
433 } | |
5280 | 434 |
22091 | 435 if (avctx) { |
22092 | 436 if (avctx->codec && avcodec_close(avctx) < 0) |
28525 | 437 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec); |
5939 | 438 |
22092 | 439 av_freep(&avctx->extradata); |
440 av_freep(&avctx->palctrl); | |
441 av_freep(&avctx->slice_offset); | |
22091 | 442 } |
5939 | 443 |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
444 av_freep(&avctx); |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
445 av_freep(&ctx->pic); |
5280 | 446 if (ctx) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
447 free(ctx); |
4952 | 448 } |
449 | |
5482 | 450 static void draw_slice(struct AVCodecContext *s, |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
451 AVFrame *src, int offset[4], |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
452 int y, int type, int height){ |
28525 | 453 sh_video_t *sh = s->opaque; |
24142 | 454 uint8_t *source[3]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; |
455 #if 0 | |
6740 | 456 int start=0, i; |
10449 | 457 int width= s->width; |
13489
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
458 int skip_stride= ((width<<lavc_param_lowres)+15)>>4; |
9400 | 459 uint8_t *skip= &s->coded_frame->mbskip_table[(y>>4)*skip_stride]; |
8413 | 460 int threshold= s->coded_frame->age; |
6740 | 461 if(s->pict_type!=B_TYPE){ |
28509 | 462 for(i=0; i*16<width+16; i++){ |
6740 | 463 if(i*16>=width || skip[i]>=threshold){ |
464 if(start==i) start++; | |
465 else{ | |
28509 | 466 uint8_t *src2[3]= {src[0] + start*16, |
467 src[1] + start*8, | |
6740 | 468 src[2] + start*8}; |
469 //printf("%2d-%2d x %d\n", start, i, y); | |
28525 | 470 mpcodecs_draw_slice (sh, src2, stride, (i-start)*16, height, start*16, y); |
6740 | 471 start= i+1; |
472 } | |
28509 | 473 } |
6740 | 474 } |
475 }else | |
476 #endif | |
15683 | 477 if (y < sh->disp_h) { |
15694 | 478 mpcodecs_draw_slice (sh, source, src->linesize, sh->disp_w, (y+height)<=sh->disp_h?height:sh->disp_h-y, 0, y); |
15683 | 479 } |
5482 | 480 } |
4952 | 481 |
10436 | 482 |
12006 | 483 static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){ |
5280 | 484 vd_ffmpeg_ctx *ctx = sh->context; |
485 AVCodecContext *avctx = ctx->avctx; | |
11194 | 486 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
|
487 int width, height; |
4952 | 488 |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
489 width = avctx->width; |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
490 height = avctx->height; |
15569 | 491 |
492 // HACK! | |
493 // if sh->ImageDesc is non-NULL, it means we decode QuickTime(tm) video. | |
494 // use dimensions from BIH to avoid black borders at the right and bottom. | |
495 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
|
496 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
|
497 height = sh->bih->biHeight>>lavc_param_lowres; |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
498 } |
28509 | 499 |
11414 | 500 // it is possible another vo buffers to be used after vo config() |
501 // 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
|
502 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
|
503 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
|
504 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
|
505 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
|
506 !ctx->vo_initialized) |
5280 | 507 { |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
508 // 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
|
509 // 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
|
510 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
|
511 mp_msg(MSGT_DECVIDEO, MSGL_V, "[ffmpeg] aspect_ratio: %f\n", aspect); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
512 if (sh->aspect == 0 || |
28509 | 513 av_cmp_q(avctx->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
|
514 ctx->last_sample_aspect_ratio)) |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
515 sh->aspect = aspect; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 ctx->pix_fmt = pix_fmt; |
28527 | 520 ctx->best_csp = pixfmt2imgfmt(pix_fmt); |
28525 | 521 if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp)) |
28523 | 522 return -1; |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
523 ctx->vo_initialized = 1; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
524 } |
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
|
525 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
|
526 } |
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
|
527 |
8413 | 528 static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ |
28525 | 529 sh_video_t *sh = avctx->opaque; |
6734 | 530 vd_ffmpeg_ctx *ctx = sh->context; |
28525 | 531 mp_image_t *mpi=NULL; |
6875 | 532 int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; |
6737 | 533 int type= MP_IMGTYPE_IPB; |
8339 | 534 int width= avctx->width; |
535 int height= avctx->height; | |
6738 | 536 int align=15; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
537 //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); |
6738 | 538 if(avctx->pix_fmt == PIX_FMT_YUV410P) |
539 align=63; //yes seriously, its really needed (16x16 chroma blocks in SVQ1 -> 64x64) | |
540 | |
28523 | 541 if (pic->buffer_hints) { |
28525 | 542 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints); |
28523 | 543 type = MP_IMGTYPE_TEMP; |
544 if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE) | |
545 flags |= MP_IMGFLAG_READABLE; | |
546 if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) { | |
547 type = MP_IMGTYPE_STATIC; | |
548 flags |= MP_IMGFLAG_PRESERVE; | |
549 } | |
550 if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { | |
551 type = MP_IMGTYPE_STATIC; | |
552 flags |= MP_IMGFLAG_PRESERVE; | |
553 } | |
554 flags|=(!avctx->hurry_up && ctx->do_slices) ? | |
555 MP_IMGFLAG_DRAW_CALLBACK:0; | |
28525 | 556 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n"); |
28523 | 557 } else { |
558 if(!pic->reference){ | |
559 ctx->b_count++; | |
560 flags|=(!avctx->hurry_up && ctx->do_slices) ? | |
561 MP_IMGFLAG_DRAW_CALLBACK:0; | |
562 }else{ | |
563 ctx->ip_count++; | |
564 flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE | |
565 | (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0); | |
566 } | |
11420 | 567 } |
8339 | 568 |
28525 | 569 if(init_vo(sh, avctx->pix_fmt) < 0){ |
9991 | 570 avctx->release_buffer= avcodec_default_release_buffer; |
571 avctx->get_buffer= avcodec_default_get_buffer; | |
572 return avctx->get_buffer(avctx, pic); | |
573 } | |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
574 |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
575 if (IMGFMT_IS_XVMC(ctx->best_csp) || IMGFMT_IS_VDPAU(ctx->best_csp)) { |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
576 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
|
577 } else |
28523 | 578 if (!pic->buffer_hints) { |
579 if(ctx->b_count>1 || ctx->ip_count>2){ | |
580 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
|
581 |
28523 | 582 ctx->do_dr1=0; //FIXME |
583 avctx->get_buffer= avcodec_default_get_buffer; | |
584 return avctx->get_buffer(avctx, pic); | |
585 } | |
586 | |
587 if(avctx->has_b_frames){ | |
588 type= MP_IMGTYPE_IPB; | |
589 }else{ | |
590 type= MP_IMGTYPE_IP; | |
591 } | |
28525 | 592 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
|
593 } |
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
|
594 |
28525 | 595 mpi= mpcodecs_get_image(sh, type, flags, |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
596 (width+align)&(~align), (height+align)&(~align)); |
28608
7a759aa746b6
Handle mpcodecs_get_image returning NULL, FFmpeg most of the time handles
reimar
parents:
28601
diff
changeset
|
597 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
|
598 |
11000 | 599 // ok, let's see what did we get: |
28525 | 600 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
|
601 !(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
|
602 // 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
|
603 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
|
604 } else |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
605 avctx->draw_horiz_band= NULL; |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
606 if(IMGFMT_IS_VDPAU(mpi->imgfmt)) { |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
607 avctx->draw_horiz_band= draw_slice; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
608 } |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
609 #if CONFIG_XVMC |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
610 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
|
611 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
|
612 avctx->draw_horiz_band= draw_slice; |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
613 if(!avctx->xvmc_acceleration) { |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
614 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
|
615 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
616 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
617 // 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
|
618 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
619 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
|
620 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
|
621 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
622 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
623 // 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
|
624 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
625 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
|
626 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
|
627 assert(render != 0); |
28573
67d2779b13ec
The AV_XVMC_RENDER_MAGIC constant was renamed to AV_XVMC_ID in FFmpeg.
diego
parents:
28572
diff
changeset
|
628 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
|
629 render->state |= AV_XVMC_STATE_PREDICTION; |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
630 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
631 #endif |
11420 | 632 |
28523 | 633 // Palette support: libavcodec copies palette to *data[1] |
634 if (mpi->bpp == 8) | |
635 mpi->planes[1] = av_malloc(AVPALETTE_SIZE); | |
11420 | 636 |
8339 | 637 pic->data[0]= mpi->planes[0]; |
638 pic->data[1]= mpi->planes[1]; | |
639 pic->data[2]= mpi->planes[2]; | |
8595 | 640 |
28509 | 641 #if 0 |
8595 | 642 assert(mpi->width >= ((width +align)&(~align))); |
643 assert(mpi->height >= ((height+align)&(~align))); | |
644 assert(mpi->stride[0] >= mpi->width); | |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
645 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
|
646 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
|
647 const int c_size= mpi->stride[1] * ((mpi->h>>1)-1) + (mpi->w>>1); |
28509 | 648 |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
649 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
|
650 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
|
651 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
|
652 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
|
653 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
|
654 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
|
655 } |
8595 | 656 #endif |
6734 | 657 |
8339 | 658 /* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames |
659 * lavc will check that and die with an error message, if its not true | |
660 */ | |
661 pic->linesize[0]= mpi->stride[0]; | |
662 pic->linesize[1]= mpi->stride[1]; | |
663 pic->linesize[2]= mpi->stride[2]; | |
6734 | 664 |
8339 | 665 pic->opaque = mpi; |
6742
93bce3460e2a
fallback to slices, if dr1 fails (bug found by kabi)
michael
parents:
6740
diff
changeset
|
666 //printf("%X\n", (int)mpi->planes[0]); |
6869 | 667 #if 0 |
668 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
669 printf("D"); | |
670 else if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) | |
671 printf("S"); | |
672 else | |
673 printf("."); | |
674 #endif | |
8339 | 675 if(pic->reference){ |
676 pic->age= ctx->ip_age[0]; | |
28509 | 677 |
8339 | 678 ctx->ip_age[0]= ctx->ip_age[1]+1; |
679 ctx->ip_age[1]= 1; | |
680 ctx->b_age++; | |
681 }else{ | |
682 pic->age= ctx->b_age; | |
28509 | 683 |
8339 | 684 ctx->ip_age[0]++; |
685 ctx->ip_age[1]++; | |
686 ctx->b_age=1; | |
687 } | |
8411 | 688 pic->type= FF_BUFFER_TYPE_USER; |
7928 | 689 return 0; |
8339 | 690 } |
691 | |
8413 | 692 static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){ |
28525 | 693 mp_image_t *mpi= pic->opaque; |
694 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
|
695 vd_ffmpeg_ctx *ctx = sh->context; |
8339 | 696 int i; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
697 |
28509 | 698 //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
|
699 |
28523 | 700 if(ctx->ip_count <= 2 && ctx->b_count<=1){ |
701 if(mpi->flags&MP_IMGFLAG_PRESERVE) | |
702 ctx->ip_count--; | |
703 else | |
704 ctx->b_count--; | |
705 } | |
11420 | 706 |
28554 | 707 if (mpi) { |
708 // Palette support: free palette buffer allocated in get_buffer | |
709 if (mpi->bpp == 8) | |
710 av_freep(&mpi->planes[1]); | |
28553
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
711 #if CONFIG_XVMC |
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
712 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
|
713 struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)pic->data[2]; //same as mpi->priv |
28553
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
714 if(mp_msg_test(MSGT_DECVIDEO, MSGL_DBG5)) |
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
715 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::release_buffer (xvmc render=%p)\n", render); |
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
716 assert(render!=NULL); |
28573
67d2779b13ec
The AV_XVMC_RENDER_MAGIC constant was renamed to AV_XVMC_ID in FFmpeg.
diego
parents:
28572
diff
changeset
|
717 assert(render->xvmc_id == AV_XVMC_ID); |
28553
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
718 render->state&=~AV_XVMC_STATE_PREDICTION; |
81931c7c0cf3
Make the default release_buffer work for XvMC, use it and remove mc_release_buffer
reimar
parents:
28552
diff
changeset
|
719 } |
28554 | 720 #endif |
28555 | 721 // 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
|
722 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
|
723 } |
11420 | 724 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
725 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
|
726 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
|
727 return; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
728 } |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
729 |
8339 | 730 for(i=0; i<4; i++){ |
731 pic->data[i]= NULL; | |
732 } | |
733 //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
|
734 } |
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
|
735 |
7573 | 736 // copypaste from demux_real.c - it should match to get it working! |
737 //FIXME put into some header | |
738 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
|
739 uint32_t chunks; // number of chunks |
7573 | 740 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
|
741 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
|
742 uint32_t chunktab; // offset to chunk offset array |
7573 | 743 } dp_hdr_t; |
744 | |
22076 | 745 void swap_palette(void *pal) { |
746 int i; | |
747 uint32_t *p = pal; | |
748 for (i = 0; i < AVPALETTE_COUNT; i++) | |
749 p[i] = le2me_32(p[i]); | |
750 } | |
13190 | 751 |
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
|
752 // decode a frame |
28525 | 753 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
|
754 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
|
755 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
|
756 vd_ffmpeg_ctx *ctx = sh->context; |
8413 | 757 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
|
758 AVCodecContext *avctx = ctx->avctx; |
28525 | 759 mp_image_t *mpi=NULL; |
6737 | 760 int dr1= ctx->do_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
|
761 |
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
|
762 if(len<=0) return NULL; // skipped frame |
6734 | 763 |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
764 //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
|
765 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
|
766 avctx->draw_horiz_band=NULL; |
25962 | 767 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
|
768 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
|
769 (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
|
770 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
|
771 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
|
772 // 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
|
773 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
|
774 } |
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
|
775 } |
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
|
776 |
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
|
777 avctx->hurry_up=(flags&3)?((flags&2)?2:1):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
|
778 |
16497
182794778785
print the first 16 bytes of frame data with -v -v, helps detect when
reimar
parents:
15986
diff
changeset
|
779 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
|
780 ((int *)data)[0], ((int *)data)[1], ((int *)data)[2], ((int *)data)[3]); |
8339 | 781 ret = avcodec_decode_video(avctx, pic, |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
782 &got_picture, data, len); |
13190 | 783 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
784 dr1= ctx->do_dr1; |
28525 | 785 if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n"); |
9547 | 786 //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
|
787 //-- vstats generation |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
788 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
|
789 static FILE *fvstats=NULL; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
790 char filename[20]; |
6834
2d7dfcc79651
Fix overall frametime overflow, hopefully long long int is portable. (untested, will test tomorrow)
atmos4
parents:
6833
diff
changeset
|
791 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
|
792 static int frame_number=0; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
793 static double all_frametime=0.0; |
8413 | 794 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
|
795 double quality=0.0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
796 |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
797 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
798 time_t today2; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
799 struct tm *today; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
800 today2 = time(NULL); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
801 today = localtime(&today2); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
802 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
|
803 today->tm_min, today->tm_sec); |
28525 | 804 fvstats = fopen(filename, "w"); |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
805 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
806 perror("fopen"); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
807 lavc_param_vstats=0; // disable block |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
808 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
809 /*exit(1);*/ |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
810 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
811 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
812 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
813 // average MB quantizer |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
814 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
815 int x, y; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
816 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
|
817 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
|
818 int8_t *q = pic->qscale_table; |
28525 | 819 for(y = 0; y < h; y++) { |
820 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
|
821 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
|
822 q += pic->qstride; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
823 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
824 quality /= w * h; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
825 } |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
826 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
827 all_len+=len; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
828 all_frametime+=sh->frametime; |
8411 | 829 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
|
830 ++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
|
831 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
|
832 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
|
833 (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
|
834 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
|
835 case FF_I_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
836 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
|
837 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
838 case FF_P_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
839 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
|
840 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
841 case FF_S_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
842 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
|
843 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
844 case FF_B_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
845 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
|
846 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
847 default: |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
848 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
|
849 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
850 } |
28509 | 851 |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
852 ctx->qp_stat[(int)(quality+0.5)]++; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
853 ctx->qp_sum += quality; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
854 ctx->inv_qp_sum += 1.0/(double)quality; |
28509 | 855 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
856 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
857 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
858 //-- |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
859 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
860 if(!got_picture) return NULL; // skipped image |
6738 | 861 |
28525 | 862 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
|
863 |
8339 | 864 if(dr1 && pic->opaque){ |
28525 | 865 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
|
866 } |
28509 | 867 |
5482 | 868 if(!mpi) |
4952 | 869 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
|
870 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
|
871 if(!mpi){ // temporary! |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
872 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
|
873 return NULL; |
4952 | 874 } |
28509 | 875 |
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
|
876 if(!dr1){ |
8339 | 877 mpi->planes[0]=pic->data[0]; |
878 mpi->planes[1]=pic->data[1]; | |
879 mpi->planes[2]=pic->data[2]; | |
880 mpi->stride[0]=pic->linesize[0]; | |
881 mpi->stride[1]=pic->linesize[1]; | |
882 mpi->stride[2]=pic->linesize[2]; | |
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
|
883 } |
28509 | 884 |
11372
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
885 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
|
886 return NULL; |
4952 | 887 |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
888 if(avctx->pix_fmt==PIX_FMT_YUV422P && 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
|
889 // 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
|
890 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
|
891 mpi->stride[2]*=2; |
4952 | 892 } |
28509 | 893 |
28299
8baa89b228c5
revert #ifdef WORDS_BIGENDIAN => #if WORDS_BIGENDIAN changes from r28331
gpoirier
parents:
28296
diff
changeset
|
894 #ifdef WORDS_BIGENDIAN |
22076 | 895 // FIXME: this might cause problems for buffers with FF_BUFFER_HINTS_PRESERVE |
896 if (mpi->bpp == 8) | |
897 swap_palette(mpi->planes[1]); | |
898 #endif | |
6665 | 899 /* to comfirm with newer lavc style */ |
8339 | 900 mpi->qscale =pic->qscale_table; |
901 mpi->qstride=pic->qstride; | |
902 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
|
903 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
|
904 mpi->fields = MP_IMGFIELD_ORDERED; |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
905 if(pic->interlaced_frame) mpi->fields |= MP_IMGFIELD_INTERLACED; |
28509 | 906 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
|
907 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
|
908 |
4952 | 909 return mpi; |
910 } | |
911 | |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
912 #if CONFIG_XVMC || CONFIG_VDPAU |
28525 | 913 static enum PixelFormat get_format(struct AVCodecContext *avctx, |
914 const enum PixelFormat *fmt){ | |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
915 enum PixelFormat selected_format; |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
916 int imgfmt; |
28525 | 917 sh_video_t *sh = avctx->opaque; |
28523 | 918 int i; |
12006 | 919 |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
920 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
|
921 imgfmt = pixfmt2imgfmt(fmt[i]); |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
922 if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue; |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
923 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
|
924 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
|
925 break; |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
926 } |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
927 } |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
928 selected_format = fmt[i]; |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
929 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
|
930 return selected_format; |
12006 | 931 } |
28584 | 932 #endif /* CONFIG_XVMC || CONFIG_VDPAU */ |