Mercurial > mplayer.hg
annotate libmpcodecs/vd_ffmpeg.c @ 22153:0cf24df5d97b
Revert part of commit r22170.
FFmpeg lavcodecs version is still
(or according to ffmpeg commit r7868, it's back to)
49.3.0, so global variables are not yet directly accessable (if ever).
author | iive |
---|---|
date | Wed, 07 Feb 2007 12:31:37 +0000 |
parents | 1f6c89bc1c3a |
children | 1a2a37852799 |
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" | |
9 | |
21372 | 10 #include "libavutil/common.h" |
21457 | 11 #include "libavutil/intreadwrite.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21498
diff
changeset
|
12 #include "mpbswap.h" |
4952 | 13 |
14 #include "vd_internal.h" | |
15 | |
16 static vd_info_t info = { | |
17 "FFmpeg's libavcodec codec family", | |
18 "ffmpeg", | |
19 "A'rpi", | |
7388 | 20 "A'rpi, Michael, Alex", |
21 "native codecs (http://ffmpeg.sf.net/)" | |
4952 | 22 }; |
23 | |
24 LIBVD_EXTERN(ffmpeg) | |
25 | |
26 #ifdef USE_LIBAVCODEC_SO | |
7004 | 27 #include <ffmpeg/avcodec.h> |
4952 | 28 #else |
29 #include "libavcodec/avcodec.h" | |
30 #endif | |
31 | |
10362 | 32 #ifdef HAVE_XVMC |
33 #include "xvmc_render.h" | |
34 #endif | |
35 | |
4952 | 36 int avcodec_inited=0; |
37 | |
5280 | 38 typedef struct { |
39 AVCodecContext *avctx; | |
8413 | 40 AVFrame *pic; |
17973 | 41 enum PixelFormat pix_fmt; |
8237 | 42 float last_aspect; |
5482 | 43 int do_slices; |
6734 | 44 int do_dr1; |
5482 | 45 int vo_inited; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
46 int best_csp; |
8339 | 47 int b_age; |
48 int ip_age[2]; | |
8411 | 49 int qp_stat[32]; |
50 double qp_sum; | |
51 double inv_qp_sum; | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
52 int ip_count; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
53 int b_count; |
5280 | 54 } vd_ffmpeg_ctx; |
55 | |
17463 | 56 //#ifdef USE_LIBPOSTPROC |
4952 | 57 //unsigned int lavc_pp=0; |
58 //#endif | |
59 | |
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
|
60 #include "m_option.h" |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
61 |
8413 | 62 static int get_buffer(AVCodecContext *avctx, AVFrame *pic); |
63 static void release_buffer(AVCodecContext *avctx, AVFrame *pic); | |
12006 | 64 static enum PixelFormat get_format(struct AVCodecContext * avctx, |
65 const enum PixelFormat * pix_fmt); | |
6739 | 66 |
10362 | 67 #ifdef HAVE_XVMC |
68 static int mc_get_buffer(AVCodecContext *avctx, AVFrame *pic); | |
69 static void mc_release_buffer(AVCodecContext *avctx, AVFrame *pic); | |
70 static void mc_render_slice(struct AVCodecContext *s, | |
10452 | 71 AVFrame *src, int offset[4], |
72 int y, int type, int height); | |
10362 | 73 #endif |
74 | |
7722 | 75 static int lavc_param_workaround_bugs= FF_BUG_AUTODETECT; |
76 static int lavc_param_error_resilience=2; | |
77 static int lavc_param_error_concealment=3; | |
6355 | 78 static int lavc_param_gray=0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
79 static int lavc_param_vstats=0; |
7564 | 80 static int lavc_param_idct_algo=0; |
8341 | 81 static int lavc_param_debug=0; |
11702 | 82 static int lavc_param_vismv=0; |
12670 | 83 static int lavc_param_skip_top=0; |
84 static int lavc_param_skip_bottom=0; | |
13230 | 85 static int lavc_param_fast=0; |
13473 | 86 static int lavc_param_lowres=0; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
87 static char *lavc_param_lowres_str=NULL; |
15986 | 88 static char *lavc_param_skip_loop_filter_str = NULL; |
89 static char *lavc_param_skip_idct_str = NULL; | |
90 static char *lavc_param_skip_frame_str = NULL; | |
17080 | 91 static int lavc_param_threads=1; |
17217 | 92 static int lavc_param_bitexact=0; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
93 |
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
|
94 m_option_t lavc_decode_opts_conf[]={ |
9547 | 95 {"bug", &lavc_param_workaround_bugs, CONF_TYPE_INT, CONF_RANGE, -1, 999999, NULL}, |
7722 | 96 {"er", &lavc_param_error_resilience, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, |
6355 | 97 {"gray", &lavc_param_gray, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART, NULL}, |
7564 | 98 {"idct", &lavc_param_idct_algo, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, |
7722 | 99 {"ec", &lavc_param_error_concealment, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, |
6869 | 100 {"vstats", &lavc_param_vstats, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
8341 | 101 {"debug", &lavc_param_debug, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, |
11702 | 102 {"vismv", &lavc_param_vismv, CONF_TYPE_INT, CONF_RANGE, 0, 9999999, NULL}, |
12670 | 103 {"st", &lavc_param_skip_top, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, |
104 {"sb", &lavc_param_skip_bottom, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL}, | |
13230 | 105 #ifdef CODEC_FLAG2_FAST |
106 {"fast", &lavc_param_fast, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG2_FAST, NULL}, | |
107 #endif | |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
108 {"lowres", &lavc_param_lowres_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
15986 | 109 {"skiploopfilter", &lavc_param_skip_loop_filter_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
110 {"skipidct", &lavc_param_skip_idct_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
111 {"skipframe", &lavc_param_skip_frame_str, CONF_TYPE_STRING, 0, 0, 0, NULL}, | |
17080 | 112 {"threads", &lavc_param_threads, CONF_TYPE_INT, CONF_RANGE, 1, 8, NULL}, |
17217 | 113 {"bitexact", &lavc_param_bitexact, CONF_TYPE_FLAG, 0, 0, CODEC_FLAG_BITEXACT, NULL}, |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
114 {NULL, NULL, 0, 0, 0, 0, NULL} |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
115 }; |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
116 |
15986 | 117 static enum AVDiscard str2AVDiscard(char *str) { |
118 if (!str) | |
119 return AVDISCARD_DEFAULT; | |
120 if (strcasecmp(str, "none") == 0) | |
121 return AVDISCARD_NONE; | |
122 if (strcasecmp(str, "default") == 0) | |
123 return AVDISCARD_DEFAULT; | |
124 if (strcasecmp(str, "nonref") == 0) | |
125 return AVDISCARD_NONREF; | |
126 if (strcasecmp(str, "bidir") == 0) | |
127 return AVDISCARD_BIDIR; | |
128 if (strcasecmp(str, "nonkey") == 0) | |
129 return AVDISCARD_NONKEY; | |
130 if (strcasecmp(str, "all") == 0) | |
131 return AVDISCARD_ALL; | |
132 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Unknown discard value %s\n", str); | |
133 return AVDISCARD_DEFAULT; | |
134 } | |
135 | |
4952 | 136 // to set/get/query special features/parameters |
137 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
|
138 vd_ffmpeg_ctx *ctx = sh->context; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
139 AVCodecContext *avctx = ctx->avctx; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
140 switch(cmd){ |
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
141 case VDCTRL_QUERY_FORMAT: |
10362 | 142 { |
143 int format =(*((int*)arg)); | |
144 if( format == ctx->best_csp ) return CONTROL_TRUE;//supported | |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
145 // possible conversions: |
10362 | 146 switch( format ){ |
6739 | 147 case IMGFMT_YV12: |
148 case IMGFMT_IYUV: | |
149 case IMGFMT_I420: | |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
150 // "converted" using pointer/stride modification |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
151 if(avctx->pix_fmt==PIX_FMT_YUV420P) return CONTROL_TRUE;// u/v swap |
11064 | 152 if(avctx->pix_fmt==PIX_FMT_YUV422P && !ctx->do_dr1) return CONTROL_TRUE;// half stride |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
153 break; |
10452 | 154 #ifdef HAVE_XVMC |
155 case IMGFMT_XVMC_IDCT_MPEG2: | |
156 case IMGFMT_XVMC_MOCO_MPEG2: | |
10471 | 157 if(avctx->pix_fmt==PIX_FMT_XVMC_MPEG2_IDCT) return CONTROL_TRUE; |
10452 | 158 #endif |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
159 } |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
160 return CONTROL_FALSE; |
11977
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
161 } |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
162 break; |
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
163 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
|
164 avcodec_flush_buffers(avctx); |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
165 return CONTROL_TRUE; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
166 case VDCTRL_QUERY_UNSEEN_FRAMES: |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
167 return avctx->has_b_frames + 10; |
10362 | 168 } |
4952 | 169 return CONTROL_UNKNOWN; |
170 } | |
171 | |
20741 | 172 void mp_msp_av_log_callback(void* ptr, int level, const char* fmt, va_list vl) |
173 { | |
174 static int print_prefix=1; | |
175 AVClass* avc= ptr ? *(AVClass**)ptr : NULL; | |
176 int type= MSGT_FIXME; | |
177 int mp_level; | |
178 char buf[256]; | |
179 | |
21242 | 180 switch(level){ |
181 case AV_LOG_DEBUG: mp_level= MSGL_V ; break; | |
182 case AV_LOG_INFO : mp_level= MSGL_INFO; break; | |
183 case AV_LOG_ERROR: mp_level= MSGL_ERR ; break; | |
184 default : mp_level= MSGL_ERR ; break; | |
185 } | |
186 | |
187 if (!mp_msg_test(type, mp_level)) return; | |
188 | |
20741 | 189 if(ptr){ |
190 if(!strcmp(avc->class_name, "AVCodecContext")){ | |
191 AVCodecContext * s= ptr; | |
192 if(s->codec){ | |
193 if(s->codec->type == CODEC_TYPE_AUDIO){ | |
194 if(s->codec->decode) | |
195 type= MSGT_DECAUDIO; | |
196 }else if(s->codec->type == CODEC_TYPE_VIDEO){ | |
197 if(s->codec->decode) | |
198 type= MSGT_DECVIDEO; | |
199 } | |
200 //FIXME subtitles, encoders (what msgt for them? there is no appropiate ...) | |
201 } | |
202 }else if(!strcmp(avc->class_name, "AVFormatContext")){ | |
203 #if 0 //needs libavformat include FIXME iam too lazy to do this cleanly,probably the whole should be moved out of this file ... | |
204 AVFormatContext * s= ptr; | |
205 if(s->iformat) | |
206 type= MSGT_DEMUXER; | |
207 else if(s->oformat) | |
208 type= MSGT_MUXER; | |
209 #endif | |
210 } | |
211 } | |
212 | |
213 if(print_prefix && avc) { | |
214 mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); | |
215 } | |
216 | |
21243 | 217 print_prefix= strchr(fmt, '\n') != NULL; |
20741 | 218 vsnprintf(buf, sizeof(buf), fmt, vl); |
219 mp_msg(type, mp_level, buf); | |
220 } | |
221 | |
4952 | 222 // init driver |
223 static int init(sh_video_t *sh){ | |
5280 | 224 AVCodecContext *avctx; |
225 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
|
226 AVCodec *lavc_codec; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
227 int lowres_w=0; |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
228 int do_vis_debug= lavc_param_vismv || (lavc_param_debug&(FF_DEBUG_VIS_MB_TYPE|FF_DEBUG_VIS_QP)); |
4952 | 229 |
230 if(!avcodec_inited){ | |
231 avcodec_init(); | |
232 avcodec_register_all(); | |
233 avcodec_inited=1; | |
22153 | 234 av_log_set_callback(mp_msp_av_log_callback); |
4952 | 235 } |
5280 | 236 |
237 ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx)); | |
238 if (!ctx) | |
239 return(0); | |
240 memset(ctx, 0, sizeof(vd_ffmpeg_ctx)); | |
4952 | 241 |
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
|
242 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
|
243 if(!lavc_codec){ |
4952 | 244 mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingLAVCcodec,sh->codec->dll); |
21498 | 245 uninit(sh); |
4952 | 246 return 0; |
247 } | |
5482 | 248 |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
249 if(vd_use_slices && (lavc_codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND) && !do_vis_debug) |
5494
1c45b1484ffb
i just fixed b-frames & slices in libavcodec :) ... iam too tired for benchmarks now ...
michael
parents:
5482
diff
changeset
|
250 ctx->do_slices=1; |
6734 | 251 |
13275 | 252 if(lavc_codec->capabilities&CODEC_CAP_DR1 && !do_vis_debug && lavc_codec->id != CODEC_ID_H264) |
6734 | 253 ctx->do_dr1=1; |
8339 | 254 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
|
255 ctx->ip_count= ctx->b_count= 0; |
7444 | 256 |
8413 | 257 ctx->pic = avcodec_alloc_frame(); |
7444 | 258 ctx->avctx = avcodec_alloc_context(); |
5280 | 259 avctx = ctx->avctx; |
6739 | 260 |
10362 | 261 #ifdef HAVE_XVMC |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
262 |
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
263 #ifdef CODEC_CAP_HWACCEL |
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
264 if(lavc_codec->capabilities & CODEC_CAP_HWACCEL){ |
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
265 #else |
10362 | 266 if(lavc_codec->id == CODEC_ID_MPEG2VIDEO_XVMC){ |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
267 #endif |
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); |
10362 | 269 assert(ctx->do_dr1);//these are must to! |
270 assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails | |
271 avctx->flags|= CODEC_FLAG_EMU_EDGE;//do i need that??!! | |
12006 | 272 avctx->get_format= get_format;//for now only this decoder will use it |
10362 | 273 avctx->get_buffer= mc_get_buffer; |
274 avctx->release_buffer= mc_release_buffer; | |
10471 | 275 avctx->draw_horiz_band = mc_render_slice; |
276 avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; | |
10362 | 277 }else |
278 #endif | |
6739 | 279 if(ctx->do_dr1){ |
8339 | 280 avctx->flags|= CODEC_FLAG_EMU_EDGE; |
281 avctx->get_buffer= get_buffer; | |
282 avctx->release_buffer= release_buffer; | |
11526 | 283 avctx->reget_buffer= get_buffer; |
6739 | 284 } |
7303 | 285 |
286 #ifdef CODEC_FLAG_NOT_TRUNCATED | |
287 avctx->flags|= CODEC_FLAG_NOT_TRUNCATED; | |
288 #endif | |
17217 | 289 avctx->flags|= lavc_param_bitexact; |
4952 | 290 |
5280 | 291 avctx->width = sh->disp_w; |
292 avctx->height= sh->disp_h; | |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
293 avctx->workaround_bugs= lavc_param_workaround_bugs; |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
294 avctx->error_resilience= lavc_param_error_resilience; |
6355 | 295 if(lavc_param_gray) avctx->flags|= CODEC_FLAG_GRAY; |
13230 | 296 #ifdef CODEC_FLAG2_FAST |
297 avctx->flags2|= lavc_param_fast; | |
298 #endif | |
9547 | 299 avctx->codec_tag= sh->format; |
10847 | 300 avctx->stream_codec_tag= sh->video.fccHandler; |
7564 | 301 avctx->idct_algo= lavc_param_idct_algo; |
7722 | 302 avctx->error_concealment= lavc_param_error_concealment; |
8341 | 303 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
|
304 if (lavc_param_debug) |
22153 | 305 av_log_set_level(AV_LOG_DEBUG); |
11702 | 306 avctx->debug_mv= lavc_param_vismv; |
12670 | 307 avctx->skip_top = lavc_param_skip_top; |
308 avctx->skip_bottom= lavc_param_skip_bottom; | |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
309 if(lavc_param_lowres_str != NULL) |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
310 { |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
311 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
|
312 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
|
313 lavc_param_lowres = 0; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
314 avctx->lowres = lavc_param_lowres; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
315 } |
15986 | 316 avctx->skip_loop_filter = str2AVDiscard(lavc_param_skip_loop_filter_str); |
317 avctx->skip_idct = str2AVDiscard(lavc_param_skip_idct_str); | |
318 avctx->skip_frame = str2AVDiscard(lavc_param_skip_frame_str); | |
5280 | 319 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
|
320 switch (sh->format) { |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
321 case mmioFOURCC('S','V','Q','3'): |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
322 /* 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
|
323 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
|
324 handled here; the second case falls through to the next section. */ |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
325 if (sh->ImageDesc) { |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
326 avctx->extradata_size = (*(int*)sh->ImageDesc) - sizeof(int); |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
327 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
328 memcpy(avctx->extradata, ((int*)sh->ImageDesc)+1, avctx->extradata_size); |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
329 break; |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
330 } |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
331 /* fallthrough */ |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
332 |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
333 case mmioFOURCC('A','V','R','n'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
334 case mmioFOURCC('M','J','P','G'): |
5939 | 335 /* AVRn stores huffman table in AVI header */ |
336 /* Pegasus MJPEG stores it also in AVI header, but it uses the common | |
337 MJPG fourcc :( */ | |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
338 if (!sh->bih || sh->bih->biSize <= sizeof(BITMAPINFOHEADER)) |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
339 break; |
5939 | 340 avctx->flags |= CODEC_FLAG_EXTERN_HUFF; |
341 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); | |
17226
255b14c0bc36
malloc padding to avoid access beyond allocated memory
henry
parents:
17217
diff
changeset
|
342 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
19277
3f910f7b0e53
Fix bogus pointer addition in the extraction of extradata from
pacman
parents:
19073
diff
changeset
|
343 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
5939 | 344 |
345 #if 0 | |
346 { | |
347 int x; | |
348 uint8_t *p = avctx->extradata; | |
349 | |
350 for (x=0; x<avctx->extradata_size; x++) | |
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
|
351 mp_msg(MSGT_DECVIDEO, MSGL_INFO,"[%x] ", p[x]); |
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
|
352 mp_msg(MSGT_DECVIDEO, MSGL_INFO,"\n"); |
5939 | 353 } |
354 #endif | |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
355 break; |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
356 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
357 case mmioFOURCC('R', 'V', '1', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
358 case mmioFOURCC('R', 'V', '1', '3'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
359 case mmioFOURCC('R', 'V', '2', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
360 case mmioFOURCC('R', 'V', '3', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
361 case mmioFOURCC('R', 'V', '4', '0'): |
20920 | 362 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
|
363 /* only 1 packet per frame & sub_id from fourcc */ |
20920 | 364 avctx->extradata_size= 8; |
365 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
7574
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
366 ((uint32_t*)avctx->extradata)[0] = 0; |
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
367 ((uint32_t*)avctx->extradata)[1] = |
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
368 (sh->format == mmioFOURCC('R', 'V', '1', '3')) ? 0x10003001 : 0x10000000; |
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
369 } else { |
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
370 /* has extra slice header (demux_rm or rm->avi streamcopy) */ |
20920 | 371 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); |
372 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
373 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); | |
7574
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
374 } |
21946 | 375 avctx->sub_id= AV_RB32(avctx->extradata+4); |
7573 | 376 |
7126 | 377 // 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
|
378 break; |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
379 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
380 default: |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
381 if (!sh->bih || sh->bih->biSize <= sizeof(BITMAPINFOHEADER)) |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
382 break; |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
383 avctx->extradata_size = sh->bih->biSize-sizeof(BITMAPINFOHEADER); |
17226
255b14c0bc36
malloc padding to avoid access beyond allocated memory
henry
parents:
17217
diff
changeset
|
384 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
385 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
386 break; |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
387 } |
11420 | 388 /* Pass palette to codec */ |
389 if (sh->bih && (sh->bih->biBitCount <= 8)) { | |
18879 | 390 avctx->palctrl = calloc(1,sizeof(AVPaletteControl)); |
11420 | 391 avctx->palctrl->palette_changed = 1; |
392 if (sh->bih->biSize-sizeof(BITMAPINFOHEADER)) | |
393 /* Palette size in biSize */ | |
394 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
|
395 FFMIN(sh->bih->biSize-sizeof(BITMAPINFOHEADER), AVPALETTE_SIZE)); |
11420 | 396 else |
397 /* Palette size in biClrUsed */ | |
398 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
|
399 FFMIN(sh->bih->biClrUsed * 4, AVPALETTE_SIZE)); |
11420 | 400 } |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
401 |
8264 | 402 if(sh->bih) |
403 avctx->bits_per_sample= sh->bih->biBitCount; | |
7126 | 404 |
17080 | 405 if(lavc_param_threads > 1) |
406 avcodec_thread_init(avctx, lavc_param_threads); | |
4952 | 407 /* 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
|
408 if (avcodec_open(avctx, lavc_codec) < 0) { |
4952 | 409 mp_msg(MSGT_DECVIDEO,MSGL_ERR, MSGTR_CantOpenCodec); |
21498 | 410 uninit(sh); |
4952 | 411 return 0; |
412 } | |
413 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: libavcodec init OK!\n"); | |
5482 | 414 ctx->last_aspect=-3; |
5510 | 415 return 1; //mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YV12); |
4952 | 416 } |
417 | |
418 // uninit driver | |
419 static void uninit(sh_video_t *sh){ | |
5280 | 420 vd_ffmpeg_ctx *ctx = sh->context; |
421 AVCodecContext *avctx = ctx->avctx; | |
8411 | 422 |
423 if(lavc_param_vstats){ | |
424 int i; | |
425 for(i=1; i<32; i++){ | |
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
|
426 mp_msg(MSGT_DECVIDEO, MSGL_INFO,"QP: %d, count: %d\n", i, ctx->qp_stat[i]); |
8411 | 427 } |
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
|
428 mp_msg(MSGT_DECVIDEO, MSGL_INFO,MSGTR_MPCODECS_ArithmeticMeanOfQP, |
8413 | 429 ctx->qp_sum / avctx->coded_frame->coded_picture_number, |
430 1.0/(ctx->inv_qp_sum / avctx->coded_frame->coded_picture_number) | |
8411 | 431 ); |
432 } | |
5280 | 433 |
22091 | 434 if (avctx) { |
22092 | 435 if (avctx->codec && avcodec_close(avctx) < 0) |
436 mp_msg(MSGT_DECVIDEO,MSGL_ERR, MSGTR_CantCloseCodec); | |
5939 | 437 |
22092 | 438 av_freep(&avctx->extradata); |
439 av_freep(&avctx->palctrl); | |
440 av_freep(&avctx->slice_offset); | |
22091 | 441 } |
5939 | 442 |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
443 av_freep(&avctx); |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
444 av_freep(&ctx->pic); |
5280 | 445 if (ctx) |
446 free(ctx); | |
4952 | 447 } |
448 | |
5482 | 449 static void draw_slice(struct AVCodecContext *s, |
10436 | 450 AVFrame *src, int offset[4], |
10449 | 451 int y, int type, int height){ |
6710 | 452 sh_video_t * sh = s->opaque; |
6740 | 453 int start=0, i; |
10449 | 454 int width= s->width; |
13489
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
455 int skip_stride= ((width<<lavc_param_lowres)+15)>>4; |
9400 | 456 uint8_t *skip= &s->coded_frame->mbskip_table[(y>>4)*skip_stride]; |
8413 | 457 int threshold= s->coded_frame->age; |
10436 | 458 uint8_t *source[3]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; |
6740 | 459 #if 0 |
460 if(s->pict_type!=B_TYPE){ | |
461 for(i=0; i*16<width+16; i++){ | |
462 if(i*16>=width || skip[i]>=threshold){ | |
463 if(start==i) start++; | |
464 else{ | |
9400 | 465 uint8_t *src2[3]= {src[0] + start*16, |
6740 | 466 src[1] + start*8, |
467 src[2] + start*8}; | |
468 //printf("%2d-%2d x %d\n", start, i, y); | |
469 mpcodecs_draw_slice (sh,src2, stride, (i-start)*16, height, start*16, y); | |
470 start= i+1; | |
471 } | |
472 } | |
473 } | |
474 }else | |
475 #endif | |
15683 | 476 if (y < sh->disp_h) { |
15694 | 477 mpcodecs_draw_slice (sh, source, src->linesize, sh->disp_w, (y+height)<=sh->disp_h?height:sh->disp_h-y, 0, y); |
15683 | 478 } |
5482 | 479 } |
4952 | 480 |
10436 | 481 |
12006 | 482 static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){ |
5280 | 483 vd_ffmpeg_ctx *ctx = sh->context; |
484 AVCodecContext *avctx = ctx->avctx; | |
11194 | 485 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
|
486 int width, height; |
4952 | 487 |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
488 width = avctx->width; |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
489 height = avctx->height; |
15569 | 490 |
491 // HACK! | |
492 // if sh->ImageDesc is non-NULL, it means we decode QuickTime(tm) video. | |
493 // use dimensions from BIH to avoid black borders at the right and bottom. | |
494 if (sh->bih && sh->ImageDesc) { | |
495 width = sh->bih->biWidth>>lavc_param_lowres; | |
496 height = sh->bih->biHeight>>lavc_param_lowres; | |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
497 } |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
498 |
11414 | 499 // it is possible another vo buffers to be used after vo config() |
500 // lavc reset its buffers on width/heigh change but not on aspect change!!! | |
501 if (// aspect != ctx->last_aspect || | |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
502 width != sh->disp_w || |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
503 height != sh->disp_h || |
17973 | 504 pix_fmt != ctx->pix_fmt || |
5482 | 505 !ctx->vo_inited) |
5280 | 506 { |
11194 | 507 mp_msg(MSGT_DECVIDEO, MSGL_V, "[ffmpeg] aspect_ratio: %f\n", aspect); |
508 ctx->last_aspect = aspect; | |
8510 | 509 // if(ctx->last_aspect>=0.01 && ctx->last_aspect<100) |
10080
312eb2923169
Made the decoder honor the aspect ratio set by the container (if it was set at all).
mosu
parents:
9991
diff
changeset
|
510 if(sh->aspect==0.0) |
8510 | 511 sh->aspect = ctx->last_aspect; |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
512 sh->disp_w = width; |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
513 sh->disp_h = height; |
17973 | 514 ctx->pix_fmt = pix_fmt; |
12006 | 515 switch(pix_fmt){ |
14597
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
516 // YUVJ are YUV formats that use the full Y range and not just |
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
517 // 16 - 235 (see colorspaces.txt). |
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
518 // Currently they are all treated the same way. |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
519 case PIX_FMT_YUV410P: ctx->best_csp=IMGFMT_YVU9;break; //svq1 |
14597
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
520 case PIX_FMT_YUVJ420P: |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
521 case PIX_FMT_YUV420P: ctx->best_csp=IMGFMT_YV12;break; //mpegs |
14597
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
522 case PIX_FMT_YUVJ422P: |
8190 | 523 case PIX_FMT_YUV422P: ctx->best_csp=IMGFMT_422P;break; //mjpeg / huffyuv |
14597
9bc220e867ed
"support" YUVJ colorspaces added to libavcodec, makes mjpeg decoding work again
reimar
parents:
14576
diff
changeset
|
524 case PIX_FMT_YUVJ444P: |
8510 | 525 case PIX_FMT_YUV444P: ctx->best_csp=IMGFMT_444P;break; //photo jpeg |
7662 | 526 case PIX_FMT_YUV411P: ctx->best_csp=IMGFMT_411P;break; //dv ntsc |
22152
1f6c89bc1c3a
Fix compilation after deprecation of some lav log level and
reimar
parents:
22147
diff
changeset
|
527 case PIX_FMT_YUYV422: ctx->best_csp=IMGFMT_YUY2;break; //huffyuv perhaps in the future |
11955 | 528 case PIX_FMT_RGB24 : ctx->best_csp=IMGFMT_RGB24;break; //qtrle |
22152
1f6c89bc1c3a
Fix compilation after deprecation of some lav log level and
reimar
parents:
22147
diff
changeset
|
529 case PIX_FMT_RGB32: ctx->best_csp=IMGFMT_BGR32;break; //huffyuv / mjpeg |
11420 | 530 case PIX_FMT_BGR24 : ctx->best_csp=IMGFMT_BGR24;break; //8bps |
531 case PIX_FMT_RGB555: ctx->best_csp=IMGFMT_BGR15;break; //rpza,cram | |
12171 | 532 case PIX_FMT_RGB565: ctx->best_csp=IMGFMT_BGR16;break; //4xm |
17561 | 533 case PIX_FMT_GRAY8: ctx->best_csp=IMGFMT_Y800;break; // gray jpeg |
11420 | 534 case PIX_FMT_PAL8: ctx->best_csp=IMGFMT_BGR8;break; //8bps,mrle,cram |
10362 | 535 #ifdef HAVE_XVMC |
10471 | 536 case PIX_FMT_XVMC_MPEG2_MC:ctx->best_csp=IMGFMT_XVMC_MOCO_MPEG2;break; |
537 case PIX_FMT_XVMC_MPEG2_IDCT:ctx->best_csp=IMGFMT_XVMC_IDCT_MPEG2;break; | |
10362 | 538 #endif |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
539 default: |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
540 ctx->best_csp=0; |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
541 } |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
542 if (!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h, ctx->best_csp)) |
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
|
543 return -1; |
16963
4aa0f65686a6
do not set ctx->vo_inited when init fails. This caused a crash when a
reimar
parents:
16497
diff
changeset
|
544 ctx->vo_inited = 1; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
545 } |
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
|
546 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
|
547 } |
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
|
548 |
8413 | 549 static int get_buffer(AVCodecContext *avctx, AVFrame *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
|
550 sh_video_t * sh = avctx->opaque; |
6734 | 551 vd_ffmpeg_ctx *ctx = sh->context; |
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
|
552 mp_image_t* mpi=NULL; |
6875 | 553 int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; |
6737 | 554 int type= MP_IMGTYPE_IPB; |
8339 | 555 int width= avctx->width; |
556 int height= avctx->height; | |
6738 | 557 int align=15; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
558 //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); |
6738 | 559 if(avctx->pix_fmt == PIX_FMT_YUV410P) |
560 align=63; //yes seriously, its really needed (16x16 chroma blocks in SVQ1 -> 64x64) | |
561 | |
11420 | 562 if (pic->buffer_hints) { |
563 mp_msg(MSGT_DECVIDEO,MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints); | |
564 type = MP_IMGTYPE_TEMP; | |
565 if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE) | |
566 flags |= MP_IMGFLAG_READABLE; | |
567 if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) { | |
568 type = MP_IMGTYPE_STATIC; | |
569 flags |= MP_IMGFLAG_PRESERVE; | |
570 } | |
571 if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { | |
572 type = MP_IMGTYPE_STATIC; | |
573 flags |= MP_IMGFLAG_PRESERVE; | |
574 } | |
575 flags|=(!avctx->hurry_up && ctx->do_slices) ? | |
576 MP_IMGFLAG_DRAW_CALLBACK:0; | |
577 mp_msg(MSGT_DECVIDEO,MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n"); | |
578 } else { | |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
579 if(!pic->reference){ |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
580 ctx->b_count++; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
581 flags|=(!avctx->hurry_up && ctx->do_slices) ? |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
582 MP_IMGFLAG_DRAW_CALLBACK:0; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
583 }else{ |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
584 ctx->ip_count++; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
585 flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
586 | (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0); |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
587 } |
11420 | 588 } |
8339 | 589 |
12006 | 590 if(init_vo(sh,avctx->pix_fmt) < 0){ |
9991 | 591 avctx->release_buffer= avcodec_default_release_buffer; |
592 avctx->get_buffer= avcodec_default_get_buffer; | |
593 return avctx->get_buffer(avctx, pic); | |
594 } | |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
595 |
11420 | 596 if (!pic->buffer_hints) { |
9991 | 597 if(ctx->b_count>1 || ctx->ip_count>2){ |
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
|
598 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
|
599 |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
600 ctx->do_dr1=0; //FIXME |
8339 | 601 avctx->get_buffer= avcodec_default_get_buffer; |
602 return avctx->get_buffer(avctx, 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
|
603 } |
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 |
6737 | 605 if(avctx->has_b_frames){ |
606 type= MP_IMGTYPE_IPB; | |
607 }else{ | |
608 type= MP_IMGTYPE_IP; | |
609 } | |
610 mp_msg(MSGT_DECVIDEO,MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n"); | |
11420 | 611 } |
6737 | 612 |
613 mpi= mpcodecs_get_image(sh,type, flags, | |
6738 | 614 (width+align)&(~align), (height+align)&(~align)); |
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
|
615 |
11000 | 616 // ok, let's see what did we get: |
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
|
617 if( mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && |
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
|
618 !(mpi->flags&MP_IMGFLAG_DIRECT)){ |
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
|
619 // nice, filter/vo likes draw_callback :) |
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
|
620 avctx->draw_horiz_band= draw_slice; |
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
|
621 } else |
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
|
622 avctx->draw_horiz_band= NULL; |
11420 | 623 |
624 // Palette support: libavcodec copies palette to *data[1] | |
625 if (mpi->bpp == 8) | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
626 mpi->planes[1] = av_malloc(AVPALETTE_SIZE); |
11420 | 627 |
8339 | 628 pic->data[0]= mpi->planes[0]; |
629 pic->data[1]= mpi->planes[1]; | |
630 pic->data[2]= mpi->planes[2]; | |
8595 | 631 |
632 #if 0 | |
633 assert(mpi->width >= ((width +align)&(~align))); | |
634 assert(mpi->height >= ((height+align)&(~align))); | |
635 assert(mpi->stride[0] >= mpi->width); | |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
636 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
|
637 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
|
638 const int c_size= mpi->stride[1] * ((mpi->h>>1)-1) + (mpi->w>>1); |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
639 |
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
640 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
|
641 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
|
642 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
|
643 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
|
644 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
|
645 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
|
646 } |
8595 | 647 #endif |
6734 | 648 |
8339 | 649 /* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames |
650 * lavc will check that and die with an error message, if its not true | |
651 */ | |
652 pic->linesize[0]= mpi->stride[0]; | |
653 pic->linesize[1]= mpi->stride[1]; | |
654 pic->linesize[2]= mpi->stride[2]; | |
6734 | 655 |
8339 | 656 pic->opaque = mpi; |
6742
93bce3460e2a
fallback to slices, if dr1 fails (bug found by kabi)
michael
parents:
6740
diff
changeset
|
657 //printf("%X\n", (int)mpi->planes[0]); |
6869 | 658 #if 0 |
659 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
660 printf("D"); | |
661 else if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) | |
662 printf("S"); | |
663 else | |
664 printf("."); | |
665 #endif | |
8339 | 666 if(pic->reference){ |
667 pic->age= ctx->ip_age[0]; | |
668 | |
669 ctx->ip_age[0]= ctx->ip_age[1]+1; | |
670 ctx->ip_age[1]= 1; | |
671 ctx->b_age++; | |
672 }else{ | |
673 pic->age= ctx->b_age; | |
674 | |
675 ctx->ip_age[0]++; | |
676 ctx->ip_age[1]++; | |
677 ctx->b_age=1; | |
678 } | |
8411 | 679 pic->type= FF_BUFFER_TYPE_USER; |
7928 | 680 return 0; |
8339 | 681 } |
682 | |
8413 | 683 static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){ |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
684 mp_image_t* mpi= pic->opaque; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
685 sh_video_t * sh = avctx->opaque; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
686 vd_ffmpeg_ctx *ctx = sh->context; |
8339 | 687 int i; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
688 |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
689 //printf("release buffer %d %d %d\n", mpi ? mpi->flags&MP_IMGFLAG_PRESERVE : -99, ctx->ip_count, ctx->b_count); |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
690 |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
691 if(ctx->ip_count <= 2 && ctx->b_count<=1){ |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
692 if(mpi->flags&MP_IMGFLAG_PRESERVE) |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
693 ctx->ip_count--; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
694 else |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
695 ctx->b_count--; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
696 } |
11420 | 697 |
698 // Palette support: free palette buffer allocated in get_buffer | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
699 if ( mpi && (mpi->bpp == 8)) |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
700 av_freep(&mpi->planes[1]); |
11420 | 701 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
702 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
|
703 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
|
704 return; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
705 } |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
706 |
8339 | 707 for(i=0; i<4; i++){ |
708 pic->data[i]= NULL; | |
709 } | |
710 //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
|
711 } |
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
|
712 |
7573 | 713 // copypaste from demux_real.c - it should match to get it working! |
714 //FIXME put into some header | |
715 typedef struct dp_hdr_s { | |
716 uint32_t chunks; // number of chunks | |
717 uint32_t timestamp; // timestamp from packet header | |
718 uint32_t len; // length of actual data | |
719 uint32_t chunktab; // offset to chunk offset array | |
720 } dp_hdr_t; | |
721 | |
22076 | 722 void swap_palette(void *pal) { |
723 int i; | |
724 uint32_t *p = pal; | |
725 for (i = 0; i < AVPALETTE_COUNT; i++) | |
726 p[i] = le2me_32(p[i]); | |
727 } | |
13190 | 728 |
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
|
729 // decode a frame |
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
|
730 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ |
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
|
731 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
|
732 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
|
733 vd_ffmpeg_ctx *ctx = sh->context; |
8413 | 734 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
|
735 AVCodecContext *avctx = ctx->avctx; |
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
|
736 mp_image_t* mpi=NULL; |
6737 | 737 int dr1= ctx->do_dr1; |
13190 | 738 unsigned char *buf = 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
|
739 |
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
|
740 if(len<=0) return NULL; // skipped frame |
6734 | 741 |
12033
3dd75c52bf38
use flag for XvMC codec recognition and enable dr1 for fixed version of lavc
iive
parents:
12006
diff
changeset
|
742 //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
|
743 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
|
744 avctx->draw_horiz_band=NULL; |
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
|
745 avctx->opaque=sh; |
10161
a339c588ddcd
removed obsolete (and currently non-working) scaling functions, after that it works correctly with YV12,422P and 444P mjpegs
alex
parents:
10131
diff
changeset
|
746 if(ctx->vo_inited && !(flags&3) && !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
|
747 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, MP_IMGFLAG_PRESERVE | |
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
|
748 (ctx->do_slices?MP_IMGFLAG_DRAW_CALLBACK: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
|
749 sh->disp_w, sh->disp_h); |
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
|
750 if(mpi && mpi->flags&MP_IMGFLAG_DRAW_CALLBACK){ |
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
|
751 // vd core likes slices! |
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 avctx->draw_horiz_band=draw_slice; |
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
|
753 } |
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 } |
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 |
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 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
|
757 |
7574
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
758 // if(sh->ds->demuxer->type == DEMUXER_TYPE_REAL){ |
87f57e23e301
fixing RV10 streamcopy - detect packet format (simple single frame vs. slices
arpi
parents:
7573
diff
changeset
|
759 if( sh->format == mmioFOURCC('R', 'V', '1', '0') |
11541 | 760 || sh->format == mmioFOURCC('R', 'V', '1', '3') |
11669
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
761 || sh->format == mmioFOURCC('R', 'V', '2', '0') |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
762 || sh->format == mmioFOURCC('R', 'V', '3', '0') |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
763 || sh->format == mmioFOURCC('R', 'V', '4', '0')) |
20920 | 764 if(sh->bih->biSize>=sizeof(*sh->bih)+8){ |
7573 | 765 int i; |
766 dp_hdr_t *hdr= (dp_hdr_t*)data; | |
22147
f4f90f0f5d2b
Add missing checks in RealVideo slice handling code.
reimar
parents:
22092
diff
changeset
|
767 uint32_t *offsets = (uint32_t*)(data + hdr->chunktab) + 1; |
f4f90f0f5d2b
Add missing checks in RealVideo slice handling code.
reimar
parents:
22092
diff
changeset
|
768 char *end = data + len; |
7573 | 769 |
770 if(avctx->slice_offset==NULL) | |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
771 avctx->slice_offset= av_malloc(sizeof(int)*1000); |
7573 | 772 |
773 // for(i=0; i<25; i++) printf("%02X ", ((uint8_t*)data)[i]); | |
774 | |
22147
f4f90f0f5d2b
Add missing checks in RealVideo slice handling code.
reimar
parents:
22092
diff
changeset
|
775 avctx->slice_count= FFMIN(hdr->chunks+1, 1000); |
f4f90f0f5d2b
Add missing checks in RealVideo slice handling code.
reimar
parents:
22092
diff
changeset
|
776 for(i=0; i<avctx->slice_count && end >= &offsets[2*i+1]; i++) |
f4f90f0f5d2b
Add missing checks in RealVideo slice handling code.
reimar
parents:
22092
diff
changeset
|
777 avctx->slice_offset[i]= offsets[2*i]; |
7578 | 778 len=hdr->len; |
7573 | 779 data+= sizeof(dp_hdr_t); |
780 } | |
781 | |
16497
182794778785
print the first 16 bytes of frame data with -v -v, helps detect when
reimar
parents:
15986
diff
changeset
|
782 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
|
783 ((int *)data)[0], ((int *)data)[1], ((int *)data)[2], ((int *)data)[3]); |
8339 | 784 ret = avcodec_decode_video(avctx, 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
|
785 &got_picture, data, len); |
13190 | 786 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
787 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
|
788 if(ret<0) mp_msg(MSGT_DECVIDEO,MSGL_WARN, "Error while decoding frame!\n"); |
9547 | 789 //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
|
790 //-- vstats generation |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
791 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
|
792 static FILE *fvstats=NULL; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
793 char filename[20]; |
6834
2d7dfcc79651
Fix overall frametime overflow, hopefully long long int is portable. (untested, will test tomorrow)
atmos4
parents:
6833
diff
changeset
|
794 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
|
795 static int frame_number=0; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
796 static double all_frametime=0.0; |
8413 | 797 AVFrame *pic= avctx->coded_frame; |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
798 double quality=0.0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
799 |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
800 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
801 time_t today2; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
802 struct tm *today; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
803 today2 = time(NULL); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
804 today = localtime(&today2); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
805 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
|
806 today->tm_min, today->tm_sec); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
807 fvstats = fopen(filename,"w"); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
808 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
809 perror("fopen"); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
810 lavc_param_vstats=0; // disable block |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
811 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
812 /*exit(1);*/ |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
813 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
814 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
815 |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
816 // average MB quantizer |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
817 { |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
818 int x, y; |
13489
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
819 int w = ((avctx->width << lavc_param_lowres)+15) >> 4; |
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
820 int h = ((avctx->height << lavc_param_lowres)+15) >> 4; |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
821 int8_t *q = pic->qscale_table; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
822 for( y = 0; y < h; y++ ) { |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
823 for( x = 0; x < w; x++ ) |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
824 quality += (double)*(q+x); |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
825 q += pic->qstride; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
826 } |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
827 quality /= w * h; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
828 } |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
829 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
830 all_len+=len; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
831 all_frametime+=sh->frametime; |
8411 | 832 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
|
833 ++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
|
834 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
|
835 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
|
836 (double)(all_len*8)/all_frametime/1000.0); |
8339 | 837 switch(pic->pict_type){ |
8347 | 838 case FF_I_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
839 fprintf(fvstats, "type= I\n"); |
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
840 break; |
8347 | 841 case FF_P_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
842 fprintf(fvstats, "type= P\n"); |
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
843 break; |
8347 | 844 case FF_S_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
845 fprintf(fvstats, "type= S\n"); |
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
846 break; |
8347 | 847 case FF_B_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
848 fprintf(fvstats, "type= B\n"); |
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
849 break; |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
850 default: |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
851 fprintf(fvstats, "type= ? (%d)\n", pic->pict_type); |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
852 break; |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
853 } |
8411 | 854 |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
855 ctx->qp_stat[(int)(quality+0.5)]++; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
856 ctx->qp_sum += quality; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
857 ctx->inv_qp_sum += 1.0/(double)quality; |
8411 | 858 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
859 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
860 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
861 //-- |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
862 |
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 if(!got_picture) return NULL; // skipped image |
6738 | 864 |
12006 | 865 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
|
866 |
8339 | 867 if(dr1 && pic->opaque){ |
868 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
|
869 } |
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
|
870 |
5482 | 871 if(!mpi) |
4952 | 872 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, MP_IMGFLAG_PRESERVE, |
5280 | 873 avctx->width, avctx->height); |
4952 | 874 if(!mpi){ // temporary! |
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
|
875 mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_CouldntAllocateImageForCodec); |
4952 | 876 return NULL; |
877 } | |
878 | |
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
|
879 if(!dr1){ |
8339 | 880 mpi->planes[0]=pic->data[0]; |
881 mpi->planes[1]=pic->data[1]; | |
882 mpi->planes[2]=pic->data[2]; | |
883 mpi->stride[0]=pic->linesize[0]; | |
884 mpi->stride[1]=pic->linesize[1]; | |
885 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
|
886 } |
11372
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
887 |
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
888 if (!mpi->planes[0]) |
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
889 return NULL; |
4952 | 890 |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
891 if(avctx->pix_fmt==PIX_FMT_YUV422P && mpi->chroma_y_shift==1){ |
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
892 // we have 422p but user wants 420p |
4952 | 893 mpi->stride[1]*=2; |
894 mpi->stride[2]*=2; | |
895 } | |
896 | |
22076 | 897 #ifdef WORDS_BIGENDIAN |
898 // FIXME: this might cause problems for buffers with FF_BUFFER_HINTS_PRESERVE | |
899 if (mpi->bpp == 8) | |
900 swap_palette(mpi->planes[1]); | |
901 #endif | |
6665 | 902 /* to comfirm with newer lavc style */ |
8339 | 903 mpi->qscale =pic->qscale_table; |
904 mpi->qstride=pic->qstride; | |
905 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
|
906 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
|
907 mpi->fields = MP_IMGFIELD_ORDERED; |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
908 if(pic->interlaced_frame) mpi->fields |= MP_IMGFIELD_INTERLACED; |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
909 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
|
910 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
|
911 |
4952 | 912 return mpi; |
913 } | |
914 | |
12006 | 915 static enum PixelFormat get_format(struct AVCodecContext * avctx, |
916 const enum PixelFormat * fmt){ | |
917 sh_video_t * sh = avctx->opaque; | |
918 vd_ffmpeg_ctx *ctx = sh->context; | |
919 int i; | |
920 | |
921 #ifdef HAVE_XVMC | |
922 if(avctx->xvmc_acceleration){ | |
923 avctx->get_buffer= mc_get_buffer; | |
924 avctx->release_buffer= mc_release_buffer; | |
925 avctx->draw_horiz_band = mc_render_slice; | |
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
|
926 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedMPEG2); |
12006 | 927 assert(ctx->do_dr1);//these are must to! |
928 assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails | |
929 avctx->flags|= CODEC_FLAG_EMU_EDGE;//do i need that??!! | |
930 avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; | |
931 } | |
932 #endif | |
933 for(i=0;fmt[i]!=-1;i++){ | |
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
|
934 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt,i); |
12006 | 935 if( init_vo(sh,fmt[i]) >= 0) |
936 return fmt[i]; | |
937 } | |
938 return fmt[0]; | |
939 } | |
940 | |
10362 | 941 #ifdef HAVE_XVMC |
942 static int mc_get_buffer(AVCodecContext *avctx, AVFrame *pic){ | |
943 sh_video_t * sh = avctx->opaque; | |
944 vd_ffmpeg_ctx *ctx = sh->context; | |
945 mp_image_t* mpi=NULL; | |
946 xvmc_render_state_t * render; | |
947 int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE| | |
948 MP_IMGFLAG_DRAW_CALLBACK; | |
949 | |
950 // printf("vd_ffmpeg::mc_get_buffer (xvmc) %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); | |
10452 | 951 if(!avctx->xvmc_acceleration){ |
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
|
952 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_McGetBufferShouldWorkOnlyWithXVMC); |
10362 | 953 assert(0); |
954 exit(1); | |
10452 | 955 // return -1;//!!fixme check error conditions |
10362 | 956 } |
957 assert(avctx->draw_horiz_band == mc_render_slice); | |
958 assert(avctx->release_buffer == mc_release_buffer); | |
17932 | 959 if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) ) |
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
|
960 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_get_buffer\n"); |
10452 | 961 |
12006 | 962 if(init_vo(sh,avctx->pix_fmt) < 0){ |
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
|
963 mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_UnexpectedInitVoError); |
10362 | 964 exit(1); |
10452 | 965 // return -1;//!!fixme check error conditions |
10362 | 966 } |
967 | |
968 | |
969 | |
970 if(!pic->reference){ | |
971 ctx->b_count++; | |
972 }else{ | |
973 ctx->ip_count++; | |
974 flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE; | |
975 } | |
976 | |
977 mpi= mpcodecs_get_image(sh, MP_IMGTYPE_IPB,flags , | |
978 avctx->width, avctx->height); | |
979 if(mpi==NULL){ | |
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
|
980 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_UnrecoverableErrorRenderBuffersNotTaken); |
10362 | 981 assert(0); |
982 exit(1); | |
10452 | 983 // return -1;//!!fixme check error conditions in ffmpeg |
10362 | 984 }; |
985 | |
986 if( (mpi->flags & MP_IMGFLAG_DIRECT) == 0){ | |
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
|
987 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed); |
10362 | 988 assert(0); |
989 exit(1); | |
10452 | 990 // return -1;//!!fixme check error conditions in ffmpeg |
10362 | 991 } |
992 | |
993 pic->data[0]= mpi->planes[0]; | |
994 pic->data[1]= mpi->planes[1]; | |
995 pic->data[2]= mpi->planes[2]; | |
996 | |
997 | |
998 /* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames | |
999 * lavc will check that and die with an error message, if its not true | |
1000 */ | |
1001 pic->linesize[0]= mpi->stride[0]; | |
1002 pic->linesize[1]= mpi->stride[1]; | |
1003 pic->linesize[2]= mpi->stride[2]; | |
1004 | |
1005 pic->opaque = mpi; | |
1006 | |
1007 if(pic->reference){ | |
1008 //I or P frame | |
1009 pic->age= ctx->ip_age[0]; | |
1010 | |
1011 ctx->ip_age[0]= ctx->ip_age[1]+1; | |
1012 ctx->ip_age[1]= 1; | |
1013 ctx->b_age++; | |
1014 }else{ | |
1015 //B frame | |
1016 pic->age= ctx->b_age; | |
1017 | |
1018 ctx->ip_age[0]++; | |
1019 ctx->ip_age[1]++; | |
1020 ctx->b_age=1; | |
1021 } | |
10452 | 1022 |
10362 | 1023 pic->type= FF_BUFFER_TYPE_USER; |
10452 | 1024 |
10362 | 1025 render=(xvmc_render_state_t*)mpi->priv;//same as data[2] |
17932 | 1026 if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) ) |
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
|
1027 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_get_buffer (render=%p)\n",render); |
10362 | 1028 assert(render != 0); |
1029 assert(render->magic == MP_XVMC_RENDER_MAGIC); | |
1030 render->state |= MP_XVMC_STATE_PREDICTION; | |
1031 return 0; | |
1032 } | |
1033 | |
1034 | |
1035 static void mc_release_buffer(AVCodecContext *avctx, AVFrame *pic){ | |
1036 mp_image_t* mpi= pic->opaque; | |
1037 sh_video_t * sh = avctx->opaque; | |
1038 vd_ffmpeg_ctx *ctx = sh->context; | |
1039 xvmc_render_state_t * render; | |
1040 int i; | |
1041 | |
1042 | |
1043 if(ctx->ip_count <= 2 && ctx->b_count<=1){ | |
1044 if(mpi->flags&MP_IMGFLAG_PRESERVE) | |
1045 ctx->ip_count--; | |
1046 else | |
1047 ctx->b_count--; | |
1048 } | |
1049 | |
1050 //printf("R%X %X\n", pic->linesize[0], pic->data[0]); | |
1051 //mark the surface as not requared for prediction | |
1052 render=(xvmc_render_state_t*)pic->data[2];//same as mpi->priv | |
17932 | 1053 if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) ) |
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
|
1054 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_release_buffer (render=%p)\n",render); |
10362 | 1055 assert(render!=NULL); |
1056 assert(render->magic==MP_XVMC_RENDER_MAGIC); | |
1057 render->state&=~MP_XVMC_STATE_PREDICTION; | |
1058 for(i=0; i<4; i++){ | |
1059 pic->data[i]= NULL; | |
1060 } | |
1061 } | |
1062 | |
1063 static void mc_render_slice(struct AVCodecContext *s, | |
10452 | 1064 AVFrame *src, int offset[4], |
1065 int y, int type, int height){ | |
1066 int width= s->width; | |
1067 sh_video_t * sh = s->opaque; | |
1068 uint8_t *source[3]= {src->data[0], src->data[1], src->data[2]}; | |
10362 | 1069 |
10452 | 1070 assert(src->linesize[0]==0 && src->linesize[1]==0 && src->linesize[2]==0); |
1071 assert(offset[0]==0 && offset[1]==0 && offset[2]==0); | |
1072 | |
1073 mpcodecs_draw_slice (sh, source, src->linesize, width, height, 0, y); | |
10362 | 1074 |
1075 } | |
1076 | |
1077 #endif // HAVE_XVMC |