Mercurial > mplayer.hg
annotate libmpcodecs/vd_ffmpeg.c @ 34021:fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
Set up side data instead.
Note that for lavf demuxer we will use the merged side data anyway,
this is only for our own, e.g. AVI demuxer.
Fixes bug #1976.
author | reimar |
---|---|
date | Sat, 17 Sep 2011 16:48:40 +0000 |
parents | a5f1aaf21790 |
children | fab5ae1132e7 |
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" |
21457 | 31 #include "libavutil/intreadwrite.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21498
diff
changeset
|
32 #include "mpbswap.h" |
28527 | 33 #include "fmt-conversion.h" |
4952 | 34 |
35 #include "vd_internal.h" | |
36 | |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
37 static const vd_info_t info = { |
28523 | 38 "FFmpeg's libavcodec codec family", |
39 "ffmpeg", | |
40 "A'rpi", | |
41 "A'rpi, Michael, Alex", | |
42 "native codecs" | |
4952 | 43 }; |
44 | |
45 LIBVD_EXTERN(ffmpeg) | |
46 | |
47 #include "libavcodec/avcodec.h" | |
48 | |
30074 | 49 #if AVPALETTE_SIZE > 1024 |
50 #error palette too large, adapt libmpcodecs/vf.c:vf_get_image | |
51 #endif | |
52 | |
28412 | 53 #if CONFIG_XVMC |
28522
fee39b6b62ea
Remove local copy of xvmc_render.h, it is now an installed header in FFmpeg.
diego
parents:
28510
diff
changeset
|
54 #include "libavcodec/xvmc.h" |
10362 | 55 #endif |
56 | |
5280 | 57 typedef struct { |
58 AVCodecContext *avctx; | |
8413 | 59 AVFrame *pic; |
17973 | 60 enum PixelFormat pix_fmt; |
5482 | 61 int do_slices; |
6734 | 62 int do_dr1; |
25962 | 63 int vo_initialized; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
64 int best_csp; |
8339 | 65 int b_age; |
66 int ip_age[2]; | |
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; |
12670 | 94 static int lavc_param_skip_top=0; |
95 static int lavc_param_skip_bottom=0; | |
13230 | 96 static int lavc_param_fast=0; |
13473 | 97 static int lavc_param_lowres=0; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
98 static char *lavc_param_lowres_str=NULL; |
15986 | 99 static char *lavc_param_skip_loop_filter_str = NULL; |
100 static char *lavc_param_skip_idct_str = NULL; | |
101 static char *lavc_param_skip_frame_str = NULL; | |
17080 | 102 static int lavc_param_threads=1; |
17217 | 103 static int lavc_param_bitexact=0; |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
104 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
|
105 static enum AVDiscard skip_idct; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
106 static enum AVDiscard skip_frame; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
107 |
31953 | 108 static const mp_image_t mpi_no_picture = |
109 { | |
110 .type = MP_IMGTYPE_INCOMPLETE | |
111 }; | |
112 | |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
24854
diff
changeset
|
113 const m_option_t lavc_decode_opts_conf[]={ |
33291
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
114 {"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
|
115 {"er" , &lavc_param_error_resilience , CONF_TYPE_INT , CONF_RANGE, 0, 99, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
116 {"gray" , &lavc_param_gray , CONF_TYPE_FLAG , 0, 0, CODEC_FLAG_PART, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
117 {"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
|
118 {"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
|
119 {"vstats" , &lavc_param_vstats , CONF_TYPE_FLAG , 0, 0, 1, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
120 {"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
|
121 {"vismv" , &lavc_param_vismv , CONF_TYPE_INT , CONF_RANGE, 0, 9999999, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
122 {"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
|
123 {"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
|
124 {"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
|
125 {"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
|
126 {"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
|
127 {"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
|
128 {"skipframe" , &lavc_param_skip_frame_str , CONF_TYPE_STRING , 0, 0, 0, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
129 {"threads" , &lavc_param_threads , CONF_TYPE_INT , CONF_RANGE, 1, 8, NULL}, |
0a865c5a1a7c
Vertical alignment / test mplayer-gitsvn @ mplayerhq.hu
michael
parents:
33260
diff
changeset
|
130 {"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
|
131 {"o" , &lavc_avopt , CONF_TYPE_STRING , 0, 0, 0, NULL}, |
28523 | 132 {NULL, NULL, 0, 0, 0, 0, NULL} |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
133 }; |
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
134 |
15986 | 135 static enum AVDiscard str2AVDiscard(char *str) { |
26694 | 136 if (!str) return AVDISCARD_DEFAULT; |
137 if (strcasecmp(str, "none" ) == 0) return AVDISCARD_NONE; | |
138 if (strcasecmp(str, "default") == 0) return AVDISCARD_DEFAULT; | |
139 if (strcasecmp(str, "nonref" ) == 0) return AVDISCARD_NONREF; | |
140 if (strcasecmp(str, "bidir" ) == 0) return AVDISCARD_BIDIR; | |
141 if (strcasecmp(str, "nonkey" ) == 0) return AVDISCARD_NONKEY; | |
142 if (strcasecmp(str, "all" ) == 0) return AVDISCARD_ALL; | |
143 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Unknown discard value %s\n", str); | |
15986 | 144 return AVDISCARD_DEFAULT; |
145 } | |
146 | |
4952 | 147 // to set/get/query special features/parameters |
28525 | 148 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
|
149 vd_ffmpeg_ctx *ctx = sh->context; |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
150 AVCodecContext *avctx = ctx->avctx; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
151 switch(cmd){ |
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
152 case VDCTRL_QUERY_FORMAT: |
28523 | 153 { |
28525 | 154 int format =(*((int *)arg)); |
155 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
|
156 // possible conversions: |
28525 | 157 switch(format){ |
6739 | 158 case IMGFMT_YV12: |
159 case IMGFMT_IYUV: | |
160 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
|
161 // "converted" using pointer/stride modification |
32507
97738e6f82dc
Use IMGFMT to compare instead of PIX_FMT to avoid issues
reimar
parents:
32488
diff
changeset
|
162 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
|
163 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
|
164 break; |
28412 | 165 #if CONFIG_XVMC |
10452 | 166 case IMGFMT_XVMC_IDCT_MPEG2: |
167 case IMGFMT_XVMC_MOCO_MPEG2: | |
10471 | 168 if(avctx->pix_fmt==PIX_FMT_XVMC_MPEG2_IDCT) return CONTROL_TRUE; |
10452 | 169 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
170 } |
6873
1206fa765697
colorspace part cleanup and support for IMGFMT_422P, _444P
arpi
parents:
6869
diff
changeset
|
171 return CONTROL_FALSE; |
28523 | 172 } |
11977
efb37725d616
flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents:
11955
diff
changeset
|
173 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
|
174 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
|
175 return CONTROL_TRUE; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18879
diff
changeset
|
176 case VDCTRL_QUERY_UNSEEN_FRAMES: |
33152
0c2838570652
Revert r33231, FFmpeg already sets has_b_frames up this way for
reimar
parents:
33144
diff
changeset
|
177 // has_b_frames includes delay due to frame-multithreading |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
178 return avctx->has_b_frames + 10; |
10362 | 179 } |
4952 | 180 return CONTROL_UNKNOWN; |
181 } | |
182 | |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
183 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
|
184 int imgfmt; |
30191
c2fc252b0d14
Avoid the error message "Unsupported PixelFormat -1" for ffh264 decoding
zuxy
parents:
30114
diff
changeset
|
185 if (fmt == PIX_FMT_NONE) |
c2fc252b0d14
Avoid the error message "Unsupported PixelFormat -1" for ffh264 decoding
zuxy
parents:
30114
diff
changeset
|
186 return; |
28731
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
187 imgfmt = pixfmt2imgfmt(fmt); |
32488 | 188 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
|
189 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
|
190 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
|
191 ctx->do_dr1 = 1; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
192 ctx->do_slices = 1; |
33041 | 193 // HACK: FFmpeg thread handling is a major mess and |
194 // hinders any attempt to decide on hwaccel after the | |
195 // codec is open. We really want this to change, so | |
196 // just beat it until it's dead | |
28732 | 197 avctx->thread_count = 1; |
33041 | 198 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
|
199 avctx->get_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
200 avctx->release_buffer = release_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
201 avctx->reget_buffer = get_buffer; |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
202 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
|
203 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
|
204 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
|
205 } else { |
d2b6fbd11f20
Add condition that lets us switch FFmpeg XvMC decoder back from
reimar
parents:
33043
diff
changeset
|
206 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
|
207 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
208 } |
244353700b38
Create a set_format_params function that sets all the special options needed
reimar
parents:
28627
diff
changeset
|
209 |
4952 | 210 // init driver |
211 static int init(sh_video_t *sh){ | |
5280 | 212 AVCodecContext *avctx; |
213 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
|
214 AVCodec *lavc_codec; |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
215 int lowres_w=0; |
11712
5905aae865c7
disable dr1&slices for the other vissualizations too
michael
parents:
11711
diff
changeset
|
216 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
|
217 // 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
|
218 // explicitly requested |
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
219 int use_slices = vd_use_slices > 0 || (vd_use_slices < 0 && lavc_param_threads <= 1); |
4952 | 220 |
31959
f957f330aa6d
Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents:
31954
diff
changeset
|
221 init_avcodec(); |
5280 | 222 |
223 ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx)); | |
224 if (!ctx) | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
225 return 0; |
5280 | 226 memset(ctx, 0, sizeof(vd_ffmpeg_ctx)); |
28509 | 227 |
31926
45966266392b
Remove pointless casts of avcodec_find_decoder_by_name() return value.
diego
parents:
31541
diff
changeset
|
228 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
|
229 if(!lavc_codec){ |
28525 | 230 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MissingLAVCcodec, sh->codec->dll); |
21498 | 231 uninit(sh); |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
232 return 0; |
4952 | 233 } |
5482 | 234 |
33032
dba2e7218893
Disable the combination of slices and multithreaded decode by default, it
reimar
parents:
33028
diff
changeset
|
235 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
|
236 ctx->do_slices=1; |
28509 | 237 |
32686 | 238 if(lavc_codec->capabilities&CODEC_CAP_DR1 && !do_vis_debug && lavc_codec->id != CODEC_ID_H264 && lavc_codec->id != CODEC_ID_INTERPLAY_VIDEO && lavc_codec->id != CODEC_ID_ROQ && lavc_codec->id != CODEC_ID_VP8 && lavc_codec->id != CODEC_ID_LAGARITH) |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
239 ctx->do_dr1=1; |
8339 | 240 ctx->b_age= ctx->ip_age[0]= ctx->ip_age[1]= 256*256*256*64; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
241 ctx->ip_count= ctx->b_count= 0; |
7444 | 242 |
8413 | 243 ctx->pic = avcodec_alloc_frame(); |
33933 | 244 ctx->avctx = avcodec_alloc_context3(lavc_codec); |
5280 | 245 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
|
246 avctx->opaque = sh; |
29667
8cfbe411de01
Make sure avctx->codec_type and codec_id are set, since libavcodec
reimar
parents:
29401
diff
changeset
|
247 avctx->codec_id = lavc_codec->id; |
6739 | 248 |
33043
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
249 avctx->get_format = get_format; |
6739 | 250 if(ctx->do_dr1){ |
28509 | 251 avctx->flags|= CODEC_FLAG_EMU_EDGE; |
33188
d5406d5a0aec
Pointless vertical alignment cosmetics to test repository write.
michael
parents:
33168
diff
changeset
|
252 avctx-> get_buffer= get_buffer; |
8339 | 253 avctx->release_buffer= release_buffer; |
33188
d5406d5a0aec
Pointless vertical alignment cosmetics to test repository write.
michael
parents:
33168
diff
changeset
|
254 avctx-> reget_buffer= get_buffer; |
6739 | 255 } |
7303 | 256 |
17217 | 257 avctx->flags|= lavc_param_bitexact; |
28509 | 258 |
31954
7eaaed7331f3
Set coded_width/coded_height instead of width/height since that's
reimar
parents:
31953
diff
changeset
|
259 avctx->coded_width = sh->disp_w; |
7eaaed7331f3
Set coded_width/coded_height instead of width/height since that's
reimar
parents:
31953
diff
changeset
|
260 avctx->coded_height= sh->disp_h; |
6265
f49ec39ab0c6
workaround bugs & error resilience ffmpeg decoder options
michael
parents:
5940
diff
changeset
|
261 avctx->workaround_bugs= lavc_param_workaround_bugs; |
27517 | 262 avctx->error_recognition= lavc_param_error_resilience; |
26395 | 263 if(lavc_param_gray) avctx->flags|= CODEC_FLAG_GRAY; |
13230 | 264 avctx->flags2|= lavc_param_fast; |
9547 | 265 avctx->codec_tag= sh->format; |
10847 | 266 avctx->stream_codec_tag= sh->video.fccHandler; |
7564 | 267 avctx->idct_algo= lavc_param_idct_algo; |
7722 | 268 avctx->error_concealment= lavc_param_error_concealment; |
8341 | 269 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
|
270 if (lavc_param_debug) |
22153 | 271 av_log_set_level(AV_LOG_DEBUG); |
11702 | 272 avctx->debug_mv= lavc_param_vismv; |
12670 | 273 avctx->skip_top = lavc_param_skip_top; |
274 avctx->skip_bottom= lavc_param_skip_bottom; | |
14169
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
275 if(lavc_param_lowres_str != NULL) |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
276 { |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
277 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
|
278 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
|
279 lavc_param_lowres = 0; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
280 avctx->lowres = lavc_param_lowres; |
95dd81b8b9de
conditional lowres: activate lowres if frame width >= threshold
nicodvb
parents:
14118
diff
changeset
|
281 } |
15986 | 282 avctx->skip_loop_filter = str2AVDiscard(lavc_param_skip_loop_filter_str); |
33292 | 283 avctx->skip_idct = str2AVDiscard(lavc_param_skip_idct_str); |
284 avctx->skip_frame = str2AVDiscard(lavc_param_skip_frame_str); | |
26692
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
285 |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
286 if(lavc_avopt){ |
33255
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
287 if (parse_avopts(avctx, lavc_avopt) < 0 && |
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
288 (!lavc_codec->priv_class || |
54faee206150
Command Line Options: Support FFmpeg per-codec AVOptions.
philipl
parents:
33235
diff
changeset
|
289 parse_avopts(avctx->priv_data, lavc_avopt) < 0)) { |
28525 | 290 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
|
291 uninit(sh); |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
292 return 0; |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
293 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
294 } |
0e325c1957f1
AVOptions support for libavcodec based video decoders.
michael
parents:
26395
diff
changeset
|
295 |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
296 skip_idct = avctx->skip_idct; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
297 skip_frame = avctx->skip_frame; |
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
298 |
28525 | 299 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
|
300 switch (sh->format) { |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
301 case mmioFOURCC('S','V','Q','3'): |
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
302 /* 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
|
303 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
|
304 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
|
305 if (sh->ImageDesc) { |
28525 | 306 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
|
307 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
28525 | 308 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
|
309 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
310 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
311 /* fallthrough */ |
19278
c41d4672c675
Fix SVQ3 extradata handling so it works correctly with demux_lavf
pacman
parents:
19277
diff
changeset
|
312 |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
313 case mmioFOURCC('A','V','R','n'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
314 case mmioFOURCC('M','J','P','G'): |
5939 | 315 /* AVRn stores huffman table in AVI header */ |
316 /* Pegasus MJPEG stores it also in AVI header, but it uses the common | |
317 MJPG fourcc :( */ | |
32105 | 318 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
|
319 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
320 avctx->flags |= CODEC_FLAG_EXTERN_HUFF; |
32105 | 321 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
|
322 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
|
323 memcpy(avctx->extradata, sh->bih+1, avctx->extradata_size); |
5939 | 324 |
325 #if 0 | |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
326 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
327 int x; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
328 uint8_t *p = avctx->extradata; |
28509 | 329 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
330 for (x=0; x<avctx->extradata_size; x++) |
28525 | 331 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "[%x] ", p[x]); |
332 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
|
333 } |
5939 | 334 #endif |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
335 break; |
18023
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
336 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
337 case mmioFOURCC('R', 'V', '1', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
338 case mmioFOURCC('R', 'V', '1', '3'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
339 case mmioFOURCC('R', 'V', '2', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
340 case mmioFOURCC('R', 'V', '3', '0'): |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
341 case mmioFOURCC('R', 'V', '4', '0'): |
20920 | 342 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
|
343 /* only 1 packet per frame & sub_id from fourcc */ |
20920 | 344 avctx->extradata_size= 8; |
345 avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
28525 | 346 ((uint32_t *)avctx->extradata)[0] = 0; |
347 ((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
|
348 (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
|
349 } else { |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
350 /* has extra slice header (demux_rm or rm->avi streamcopy) */ |
32105 | 351 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
|
352 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
|
353 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
|
354 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
355 avctx->sub_id= AV_RB32(avctx->extradata+4); |
7573 | 356 |
7126 | 357 // 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
|
358 break; |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
359 |
4ca6b585aa58
simplify extradata handling and make passing extradata on the default.
reimar
parents:
18004
diff
changeset
|
360 default: |
32105 | 361 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
|
362 break; |
32105 | 363 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
|
364 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
|
365 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
|
366 break; |
7736
b81b0ab0aa40
put M4S2 & MP4S headers in avctx->extradata (in the unlikely case that they arent missing completly)
michael
parents:
7722
diff
changeset
|
367 } |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
368 |
8264 | 369 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
|
370 avctx->bits_per_coded_sample= sh->bih->biBitCount; |
7126 | 371 |
33027
55de45e1d943
Do not use deprecated avcodec_thread_init, it is broken and does nothing currently.
reimar
parents:
33010
diff
changeset
|
372 avctx->thread_count = lavc_param_threads; |
33028 | 373 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
|
374 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
|
375 // 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
|
376 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
|
377 |
4952 | 378 /* open it */ |
33933 | 379 if (avcodec_open2(avctx, lavc_codec, NULL) < 0) { |
28525 | 380 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantOpenCodec); |
21498 | 381 uninit(sh); |
4952 | 382 return 0; |
383 } | |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
384 // 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
|
385 // 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
|
386 set_format_params(avctx, avctx->pix_fmt); |
28525 | 387 mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n"); |
388 return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12); | |
4952 | 389 } |
390 | |
391 // uninit driver | |
392 static void uninit(sh_video_t *sh){ | |
5280 | 393 vd_ffmpeg_ctx *ctx = sh->context; |
394 AVCodecContext *avctx = ctx->avctx; | |
28509 | 395 |
33260 | 396 if(lavc_param_vstats && avctx->coded_frame){ |
8411 | 397 int i; |
398 for(i=1; i<32; i++){ | |
28525 | 399 mp_msg(MSGT_DECVIDEO, MSGL_INFO, "QP: %d, count: %d\n", i, ctx->qp_stat[i]); |
8411 | 400 } |
28525 | 401 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_ArithmeticMeanOfQP, |
8413 | 402 ctx->qp_sum / avctx->coded_frame->coded_picture_number, |
403 1.0/(ctx->inv_qp_sum / avctx->coded_frame->coded_picture_number) | |
8411 | 404 ); |
405 } | |
5280 | 406 |
22091 | 407 if (avctx) { |
22092 | 408 if (avctx->codec && avcodec_close(avctx) < 0) |
28525 | 409 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec); |
5939 | 410 |
22092 | 411 av_freep(&avctx->extradata); |
412 av_freep(&avctx->palctrl); | |
413 av_freep(&avctx->slice_offset); | |
22091 | 414 } |
5939 | 415 |
14431
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
416 av_freep(&avctx); |
0c10f923746e
change malloc and free to av_ variants where needed.
reimar
parents:
14169
diff
changeset
|
417 av_freep(&ctx->pic); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32507
diff
changeset
|
418 free(ctx); |
4952 | 419 } |
420 | |
5482 | 421 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
|
422 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
|
423 int y, int type, int height){ |
28525 | 424 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
|
425 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
|
426 int strides[MP_MAX_PLANES] = {src->linesize[0], src->linesize[1], src->linesize[2]}; |
24142 | 427 #if 0 |
6740 | 428 int start=0, i; |
10449 | 429 int width= s->width; |
13489
912c906db2ed
compensate for width/height being picture width/height instead of bitstream width/height
michael
parents:
13473
diff
changeset
|
430 int skip_stride= ((width<<lavc_param_lowres)+15)>>4; |
9400 | 431 uint8_t *skip= &s->coded_frame->mbskip_table[(y>>4)*skip_stride]; |
8413 | 432 int threshold= s->coded_frame->age; |
6740 | 433 if(s->pict_type!=B_TYPE){ |
28509 | 434 for(i=0; i*16<width+16; i++){ |
6740 | 435 if(i*16>=width || skip[i]>=threshold){ |
436 if(start==i) start++; | |
437 else{ | |
28509 | 438 uint8_t *src2[3]= {src[0] + start*16, |
439 src[1] + start*8, | |
6740 | 440 src[2] + start*8}; |
441 //printf("%2d-%2d x %d\n", start, i, y); | |
28525 | 442 mpcodecs_draw_slice (sh, src2, stride, (i-start)*16, height, start*16, y); |
6740 | 443 start= i+1; |
444 } | |
28509 | 445 } |
6740 | 446 } |
447 }else | |
448 #endif | |
30588
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
449 if (height < 0) |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
450 { |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
451 int i; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
452 height = -height; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
453 y -= height; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
454 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
|
455 { |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
456 strides[i] = -strides[i]; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
457 source[i] -= strides[i]; |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
458 } |
4cc35c457d9e
Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at
reimar
parents:
30555
diff
changeset
|
459 } |
15683 | 460 if (y < sh->disp_h) { |
31270 | 461 height = FFMIN(height, sh->disp_h-y); |
462 mpcodecs_draw_slice (sh, source, strides, sh->disp_w, height, 0, y); | |
15683 | 463 } |
5482 | 464 } |
4952 | 465 |
10436 | 466 |
12006 | 467 static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){ |
5280 | 468 vd_ffmpeg_ctx *ctx = sh->context; |
469 AVCodecContext *avctx = ctx->avctx; | |
11194 | 470 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
|
471 int width, height; |
4952 | 472 |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
473 width = avctx->width; |
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
474 height = avctx->height; |
15569 | 475 |
476 // HACK! | |
477 // if sh->ImageDesc is non-NULL, it means we decode QuickTime(tm) video. | |
478 // use dimensions from BIH to avoid black borders at the right and bottom. | |
479 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
|
480 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
|
481 height = sh->bih->biHeight>>lavc_param_lowres; |
15567
c8ef0513f470
prefer width&height from bitmapinfoheader for h263 streams
henry
parents:
15064
diff
changeset
|
482 } |
28509 | 483 |
11414 | 484 // it is possible another vo buffers to be used after vo config() |
485 // 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
|
486 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
|
487 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
|
488 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
|
489 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
|
490 !ctx->vo_initialized) |
5280 | 491 { |
32603
02830ab7afb7
Reset ctx->vo_initialized to 0 on a resolution change.
reimar
parents:
32592
diff
changeset
|
492 ctx->vo_initialized = 0; |
28766
4725b3ebdba3
Add another hack to work-around the currently completely inconsistent way in
reimar
parents:
28732
diff
changeset
|
493 // 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
|
494 // 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
|
495 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
|
496 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
|
497 |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
498 // 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
|
499 // aspect if available is preferred. |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
500 // 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
|
501 // 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
|
502 // _sample_ aspect is unchanged. |
2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
reimar
parents:
32378
diff
changeset
|
503 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
|
504 sh->aspect = aspect; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 ctx->pix_fmt = pix_fmt; |
28527 | 509 ctx->best_csp = pixfmt2imgfmt(pix_fmt); |
28525 | 510 if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp)) |
28523 | 511 return -1; |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
512 ctx->vo_initialized = 1; |
5592
b545d56314d2
yuy2 support, fixed bug of dropping frame after config_vo calls
arpi
parents:
5517
diff
changeset
|
513 } |
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
|
514 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
|
515 } |
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
|
516 |
8413 | 517 static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ |
28525 | 518 sh_video_t *sh = avctx->opaque; |
6734 | 519 vd_ffmpeg_ctx *ctx = sh->context; |
28525 | 520 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
|
521 int flags= MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE; |
6737 | 522 int type= MP_IMGTYPE_IPB; |
8339 | 523 int width= avctx->width; |
524 int height= avctx->height; | |
33200
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
525 // special case to handle reget_buffer without buffer hints |
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
526 if (pic->opaque && pic->data[0] && !pic->buffer_hints) |
17ed3a57c83c
Allow DR to work with reget_buffer when no buffer_hints are set.
reimar
parents:
33199
diff
changeset
|
527 return 0; |
29879
5dbbcdb2fb47
Use avcodec_align_dimensions to appropriately align width and height in
reimar
parents:
29842
diff
changeset
|
528 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
|
529 //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count); |
6738 | 530 |
28523 | 531 if (pic->buffer_hints) { |
28525 | 532 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints); |
28523 | 533 type = MP_IMGTYPE_TEMP; |
534 if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE) | |
535 flags |= MP_IMGFLAG_READABLE; | |
536 if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) { | |
537 type = MP_IMGTYPE_STATIC; | |
538 flags |= MP_IMGFLAG_PRESERVE; | |
539 } | |
540 if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { | |
541 type = MP_IMGTYPE_STATIC; | |
542 flags |= MP_IMGFLAG_PRESERVE; | |
543 } | |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
544 flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ? |
28523 | 545 MP_IMGFLAG_DRAW_CALLBACK:0; |
28525 | 546 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n"); |
28523 | 547 } else { |
548 if(!pic->reference){ | |
549 ctx->b_count++; | |
33235
6e6eac0ea1b4
Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame.
ib
parents:
33200
diff
changeset
|
550 flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ? |
28523 | 551 MP_IMGFLAG_DRAW_CALLBACK:0; |
552 }else{ | |
553 ctx->ip_count++; | |
554 flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE | |
555 | (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0); | |
556 } | |
11420 | 557 } |
8339 | 558 |
28525 | 559 if(init_vo(sh, avctx->pix_fmt) < 0){ |
9991 | 560 avctx->release_buffer= avcodec_default_release_buffer; |
561 avctx->get_buffer= avcodec_default_get_buffer; | |
33199
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
562 avctx->reget_buffer= avcodec_default_reget_buffer; |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
563 if (pic->data[0]) |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
564 release_buffer(avctx, pic); |
9991 | 565 return avctx->get_buffer(avctx, pic); |
566 } | |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
18917
diff
changeset
|
567 |
32488 | 568 if (IMGFMT_IS_HWACCEL(ctx->best_csp)) { |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
569 type = MP_IMGTYPE_NUMBERED | (0xffff << 16); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
570 } else |
28523 | 571 if (!pic->buffer_hints) { |
572 if(ctx->b_count>1 || ctx->ip_count>2){ | |
573 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
|
574 |
28523 | 575 ctx->do_dr1=0; //FIXME |
33869
9b59c0e0948c
Fix neverending "DRI Failure" messages with frame multithreading.
reimar
parents:
33866
diff
changeset
|
576 // For frame-multithreading these contexts aren't |
9b59c0e0948c
Fix neverending "DRI Failure" messages with frame multithreading.
reimar
parents:
33866
diff
changeset
|
577 // the same and must both be updated. |
9b59c0e0948c
Fix neverending "DRI Failure" messages with frame multithreading.
reimar
parents:
33866
diff
changeset
|
578 ctx->avctx->get_buffer= |
28523 | 579 avctx->get_buffer= avcodec_default_get_buffer; |
33869
9b59c0e0948c
Fix neverending "DRI Failure" messages with frame multithreading.
reimar
parents:
33866
diff
changeset
|
580 ctx->avctx->reget_buffer= |
33199
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
581 avctx->reget_buffer= avcodec_default_reget_buffer; |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
582 if (pic->data[0]) |
85d0e813370f
Allow reget_buffer to somewhat work after DRI failure.
reimar
parents:
33197
diff
changeset
|
583 release_buffer(avctx, pic); |
28523 | 584 return avctx->get_buffer(avctx, pic); |
585 } | |
586 | |
32613
e006d3eb4e60
Treat non-ref frames like B-frames even if has_b_frames is not set and
reimar
parents:
32603
diff
changeset
|
587 if(avctx->has_b_frames || ctx->b_count){ |
28523 | 588 type= MP_IMGTYPE_IPB; |
589 }else{ | |
590 type= MP_IMGTYPE_IP; | |
591 } | |
28525 | 592 mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n"); |
6733
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
593 } |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
594 |
30074 | 595 if (ctx->best_csp == IMGFMT_RGB8 || ctx->best_csp == IMGFMT_BGR8) |
596 flags |= MP_IMGFLAG_RGB_PALETTE; | |
29879
5dbbcdb2fb47
Use avcodec_align_dimensions to appropriately align width and height in
reimar
parents:
29842
diff
changeset
|
597 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
|
598 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
|
599 |
11000 | 600 // ok, let's see what did we get: |
28525 | 601 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
|
602 !(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
|
603 // 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
|
604 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
|
605 } else |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
606 avctx->draw_horiz_band= NULL; |
32488 | 607 if(IMGFMT_IS_HWACCEL(mpi->imgfmt)) { |
28582
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
608 avctx->draw_horiz_band= draw_slice; |
4d64f83e2fac
Add support for VDPAU video out, including hardware decoding.
reimar
parents:
28573
diff
changeset
|
609 } |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
610 #if CONFIG_XVMC |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
611 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
|
612 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
|
613 if(!avctx->xvmc_acceleration) { |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
614 mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_McGetBufferShouldWorkOnlyWithXVMC); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
615 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
616 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
617 // return -1;//!!fixme check error conditions in ffmpeg |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
618 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
619 if(!(mpi->flags & MP_IMGFLAG_DIRECT)) { |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
620 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
621 assert(0); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
622 exit(1); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
623 // return -1;//!!fixme check error conditions in ffmpeg |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
624 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
625 if(mp_msg_test(MSGT_DECVIDEO, MSGL_DBG5)) |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
626 mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::get_buffer (xvmc render=%p)\n", render); |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
627 assert(render != 0); |
28573
67d2779b13ec
The AV_XVMC_RENDER_MAGIC constant was renamed to AV_XVMC_ID in FFmpeg.
diego
parents:
28572
diff
changeset
|
628 assert(render->xvmc_id == AV_XVMC_ID); |
28556
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
629 } |
85d1ab476ad5
Extend get_buffer to handle the XvMC case and remove mc_get_buffer
reimar
parents:
28555
diff
changeset
|
630 #endif |
11420 | 631 |
8339 | 632 pic->data[0]= mpi->planes[0]; |
633 pic->data[1]= mpi->planes[1]; | |
634 pic->data[2]= mpi->planes[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
635 pic->data[3]= mpi->planes[3]; |
8595 | 636 |
28509 | 637 #if 0 |
8595 | 638 assert(mpi->width >= ((width +align)&(~align))); |
639 assert(mpi->height >= ((height+align)&(~align))); | |
640 assert(mpi->stride[0] >= mpi->width); | |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
641 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
|
642 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
|
643 const int c_size= mpi->stride[1] * ((mpi->h>>1)-1) + (mpi->w>>1); |
28509 | 644 |
7051
d03fad6123a3
asserts to check buffer size and non overlapingness
michael
parents:
7004
diff
changeset
|
645 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
|
646 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
|
647 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
|
648 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
|
649 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
|
650 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
|
651 } |
8595 | 652 #endif |
6734 | 653 |
8339 | 654 /* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames |
655 * lavc will check that and die with an error message, if its not true | |
656 */ | |
657 pic->linesize[0]= mpi->stride[0]; | |
658 pic->linesize[1]= mpi->stride[1]; | |
659 pic->linesize[2]= mpi->stride[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
660 pic->linesize[3]= mpi->stride[3]; |
6734 | 661 |
8339 | 662 pic->opaque = mpi; |
6742
93bce3460e2a
fallback to slices, if dr1 fails (bug found by kabi)
michael
parents:
6740
diff
changeset
|
663 //printf("%X\n", (int)mpi->planes[0]); |
6869 | 664 #if 0 |
665 if(mpi->flags&MP_IMGFLAG_DIRECT) | |
666 printf("D"); | |
667 else if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) | |
668 printf("S"); | |
669 else | |
670 printf("."); | |
671 #endif | |
8339 | 672 if(pic->reference){ |
673 pic->age= ctx->ip_age[0]; | |
28509 | 674 |
8339 | 675 ctx->ip_age[0]= ctx->ip_age[1]+1; |
676 ctx->ip_age[1]= 1; | |
677 ctx->b_age++; | |
678 }else{ | |
679 pic->age= ctx->b_age; | |
28509 | 680 |
8339 | 681 ctx->ip_age[0]++; |
682 ctx->ip_age[1]++; | |
683 ctx->b_age=1; | |
684 } | |
8411 | 685 pic->type= FF_BUFFER_TYPE_USER; |
7928 | 686 return 0; |
8339 | 687 } |
688 | |
8413 | 689 static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){ |
28525 | 690 mp_image_t *mpi= pic->opaque; |
691 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
|
692 vd_ffmpeg_ctx *ctx = sh->context; |
8339 | 693 int i; |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
694 |
28509 | 695 //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
|
696 |
28523 | 697 if(ctx->ip_count <= 2 && ctx->b_count<=1){ |
698 if(mpi->flags&MP_IMGFLAG_PRESERVE) | |
699 ctx->ip_count--; | |
700 else | |
701 ctx->b_count--; | |
702 } | |
11420 | 703 |
28554 | 704 if (mpi) { |
705 // Palette support: free palette buffer allocated in get_buffer | |
706 if (mpi->bpp == 8) | |
707 av_freep(&mpi->planes[1]); | |
28555 | 708 // 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
|
709 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
|
710 } |
11420 | 711 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
712 if(pic->type!=FF_BUFFER_TYPE_USER){ |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
713 avcodec_default_release_buffer(avctx, pic); |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
714 return; |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
715 } |
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
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 |
3b1f37fc0693
direct rendering method 1 (disabled currently as its not bugfree / finished yet, just set dr1=1 if u want to try it)
michael
parents:
6710
diff
changeset
|
751 if(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 |
16497
182794778785
print the first 16 bytes of frame data with -v -v, helps detect when
reimar
parents:
15986
diff
changeset
|
775 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
|
776 ((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
|
777 av_init_packet(&pkt); |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
778 pkt.data = data; |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
779 pkt.size = len; |
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
780 // 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
|
781 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
|
782 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
|
783 /* Pass palette to codec */ |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
784 uint8_t *pal = av_packet_new_side_data(&pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
785 unsigned palsize = sh->bih->biSize - sizeof(*sh->bih); |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
786 if (palsize == 0) { |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
787 /* Palette size in biClrUsed */ |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
788 palsize = sh->bih->biClrUsed * 4; |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
789 } |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
790 memcpy(pal, sh->bih+1, FFMIN(palsize, AVPALETTE_SIZE)); |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
791 ctx->palette_sent = 1; |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
792 } |
29298
fb99e3db8f8b
Switch to avcodec_decode_video2 to allow a hack that makes PNG decode correctly
reimar
parents:
29059
diff
changeset
|
793 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
|
794 pkt.data = NULL; |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
795 pkt.size = 0; |
fbb87f092560
Get rid of usage of deprecated palctrl which no longer works anyway.
reimar
parents:
33933
diff
changeset
|
796 av_destruct_packet(&pkt); |
13190 | 797 |
9982
cd76f332bdee
fallback to non-dr1 if the codec wants more than 1+2 buffers
michael
parents:
9931
diff
changeset
|
798 dr1= ctx->do_dr1; |
28525 | 799 if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n"); |
9547 | 800 //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
|
801 //-- vstats generation |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
802 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
|
803 static FILE *fvstats=NULL; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
804 char filename[20]; |
6834
2d7dfcc79651
Fix overall frametime overflow, hopefully long long int is portable. (untested, will test tomorrow)
atmos4
parents:
6833
diff
changeset
|
805 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
|
806 static int frame_number=0; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
807 static double all_frametime=0.0; |
8413 | 808 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
|
809 double quality=0.0; |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
810 |
33260 | 811 if(!pic) break; |
812 | |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
813 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
814 time_t today2; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
815 struct tm *today; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
816 today2 = time(NULL); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
817 today = localtime(&today2); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
818 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
|
819 today->tm_min, today->tm_sec); |
28525 | 820 fvstats = fopen(filename, "w"); |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
821 if(!fvstats) { |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
822 perror("fopen"); |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
823 lavc_param_vstats=0; // disable block |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
824 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
825 /*exit(1);*/ |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
826 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
827 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
828 |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
829 // average MB quantizer |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
830 { |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
831 int x, y; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
832 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
|
833 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
|
834 int8_t *q = pic->qscale_table; |
28525 | 835 for(y = 0; y < h; y++) { |
836 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
|
837 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
|
838 q += pic->qstride; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
839 } |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
840 quality /= w * h; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
841 } |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
842 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
843 all_len+=len; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
844 all_frametime+=sh->frametime; |
8411 | 845 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
|
846 ++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
|
847 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
|
848 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
|
849 (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
|
850 switch(pic->pict_type){ |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
851 case FF_I_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
852 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
|
853 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
854 case FF_P_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
855 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
|
856 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
857 case FF_S_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
858 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
|
859 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
860 case FF_B_TYPE: |
8065
a3e7c0e16d5b
fixing vstats so B frames are shown as B and not P
michael
parents:
7984
diff
changeset
|
861 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
|
862 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
863 default: |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
864 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
|
865 break; |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
866 } |
28509 | 867 |
9865
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
868 ctx->qp_stat[(int)(quality+0.5)]++; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
869 ctx->qp_sum += quality; |
30893b593947
Adaptive quantization support for "-lavcopts psnr" and "-lavdopts vstats".
rguyom
parents:
9547
diff
changeset
|
870 ctx->inv_qp_sum += 1.0/(double)quality; |
28509 | 871 |
6828
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
872 break; |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
873 } |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
874 //-- |
010be15e48ad
Generate ffmpeg compatible vstats_<time>.log, when -lavdopts vstats is specified.
atmos4
parents:
6771
diff
changeset
|
875 |
31953 | 876 if(!got_picture) { |
877 if (avctx->codec->id == CODEC_ID_H264) | |
878 return &mpi_no_picture; // H.264 first field only | |
879 else | |
880 return NULL; // skipped image | |
881 } | |
6738 | 882 |
28525 | 883 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
|
884 |
8339 | 885 if(dr1 && pic->opaque){ |
28525 | 886 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
|
887 } |
28509 | 888 |
5482 | 889 if(!mpi) |
4952 | 890 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, MP_IMGFLAG_PRESERVE, |
28508
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
891 avctx->width, avctx->height); |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
892 if(!mpi){ // temporary! |
c475b032694f
Replace tabs in vd_ffmpeg by 8 spaces to better match FFmpeg's coding style.
reimar
parents:
28507
diff
changeset
|
893 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
|
894 return NULL; |
4952 | 895 } |
28509 | 896 |
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
|
897 if(!dr1){ |
8339 | 898 mpi->planes[0]=pic->data[0]; |
899 mpi->planes[1]=pic->data[1]; | |
900 mpi->planes[2]=pic->data[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
901 mpi->planes[3]=pic->data[3]; |
8339 | 902 mpi->stride[0]=pic->linesize[0]; |
903 mpi->stride[1]=pic->linesize[1]; | |
904 mpi->stride[2]=pic->linesize[2]; | |
30114
7470ba76f228
Also pass the 4th plane for planar formats on to libavcodec.
reimar
parents:
30074
diff
changeset
|
905 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
|
906 } |
28509 | 907 |
11372
3761aff4722e
If alex is too lazy to apply a patch, then i'll do it :)
attila
parents:
11194
diff
changeset
|
908 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
|
909 return NULL; |
4952 | 910 |
32507
97738e6f82dc
Use IMGFMT to compare instead of PIX_FMT to avoid issues
reimar
parents:
32488
diff
changeset
|
911 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
|
912 // 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
|
913 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
|
914 mpi->stride[2]*=2; |
4952 | 915 } |
28509 | 916 |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29298
diff
changeset
|
917 #if HAVE_BIGENDIAN |
22076 | 918 // FIXME: this might cause problems for buffers with FF_BUFFER_HINTS_PRESERVE |
919 if (mpi->bpp == 8) | |
920 swap_palette(mpi->planes[1]); | |
921 #endif | |
6665 | 922 /* to comfirm with newer lavc style */ |
8339 | 923 mpi->qscale =pic->qscale_table; |
924 mpi->qstride=pic->qstride; | |
925 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
|
926 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
|
927 mpi->fields = MP_IMGFIELD_ORDERED; |
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11541
diff
changeset
|
928 if(pic->interlaced_frame) mpi->fields |= MP_IMGFIELD_INTERLACED; |
28509 | 929 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
|
930 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
|
931 |
4952 | 932 return mpi; |
933 } | |
934 | |
28525 | 935 static enum PixelFormat get_format(struct AVCodecContext *avctx, |
936 const enum PixelFormat *fmt){ | |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
937 enum PixelFormat selected_format; |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
938 int imgfmt; |
28525 | 939 sh_video_t *sh = avctx->opaque; |
28523 | 940 int i; |
12006 | 941 |
28564
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
942 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
|
943 imgfmt = pixfmt2imgfmt(fmt[i]); |
32488 | 944 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
|
945 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
|
946 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
|
947 break; |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
948 } |
f2f0357b2c30
Restructure get_format so it can easily be extended to handle VDPAU
reimar
parents:
28563
diff
changeset
|
949 } |
28627
c327b2e9b259
Return PIX_FMT_NONE if the video system refuses all other formats.
iive
parents:
28608
diff
changeset
|
950 selected_format = fmt[i]; |
33043
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
951 if (selected_format == PIX_FMT_NONE) |
04203ae3000c
Always use get_format, reduces usage of CODEC_CAP_HWACCEL* conditions.
reimar
parents:
33042
diff
changeset
|
952 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
|
953 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
|
954 return selected_format; |
12006 | 955 } |