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