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