Mercurial > libavcodec.hg
annotate dirac.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | ffb3668ff7af |
children |
rev | line source |
---|---|
10838 | 1 /* |
2 * Copyright (C) 2007 Marco Gerards <marco@gnu.org> | |
3 * Copyright (C) 2009 David Conrad | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
10838
diff
changeset
|
23 * @file |
10838 | 24 * Dirac Decoder |
25 * @author Marco Gerards <marco@gnu.org> | |
26 */ | |
27 | |
12372
914f484bb476
Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents:
11644
diff
changeset
|
28 #include "libavcore/imgutils.h" |
10838 | 29 #include "dirac.h" |
30 #include "avcodec.h" | |
31 #include "golomb.h" | |
32 #include "mpeg12data.h" | |
33 | |
34 // defaults for source parameters | |
35 static const dirac_source_params dirac_source_parameters_defaults[] = { | |
36 { 640, 480, 2, 0, 0, 1, 1, 640, 480, 0, 0, 1, 0 }, | |
37 { 176, 120, 2, 0, 0, 9, 2, 176, 120, 0, 0, 1, 1 }, | |
38 { 176, 144, 2, 0, 1, 10, 3, 176, 144, 0, 0, 1, 2 }, | |
39 { 352, 240, 2, 0, 0, 9, 2, 352, 240, 0, 0, 1, 1 }, | |
40 { 352, 288, 2, 0, 1, 10, 3, 352, 288, 0, 0, 1, 2 }, | |
41 { 704, 480, 2, 0, 0, 9, 2, 704, 480, 0, 0, 1, 1 }, | |
42 { 704, 576, 2, 0, 1, 10, 3, 704, 576, 0, 0, 1, 2 }, | |
43 { 720, 480, 1, 1, 0, 4, 2, 704, 480, 8, 0, 3, 1 }, | |
44 { 720, 576, 1, 1, 1, 3, 3, 704, 576, 8, 0, 3, 2 }, | |
45 | |
46 { 1280, 720, 1, 0, 1, 7, 1, 1280, 720, 0, 0, 3, 3 }, | |
47 { 1280, 720, 1, 0, 1, 6, 1, 1280, 720, 0, 0, 3, 3 }, | |
48 { 1920, 1080, 1, 1, 1, 4, 1, 1920, 1080, 0, 0, 3, 3 }, | |
49 { 1920, 1080, 1, 1, 1, 3, 1, 1920, 1080, 0, 0, 3, 3 }, | |
50 { 1920, 1080, 1, 0, 1, 7, 1, 1920, 1080, 0, 0, 3, 3 }, | |
51 { 1920, 1080, 1, 0, 1, 6, 1, 1920, 1080, 0, 0, 3, 3 }, | |
52 { 2048, 1080, 0, 0, 1, 2, 1, 2048, 1080, 0, 0, 4, 4 }, | |
53 { 4096, 2160, 0, 0, 1, 2, 1, 4096, 2160, 0, 0, 4, 4 }, | |
54 | |
55 { 3840, 2160, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, | |
56 { 3840, 2160, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, | |
57 { 7680, 4320, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, | |
58 { 7680, 4320, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, | |
59 }; | |
60 | |
61 static const AVRational dirac_preset_aspect_ratios[] = { | |
62 {1, 1}, | |
63 {10, 11}, | |
64 {12, 11}, | |
65 {40, 33}, | |
66 {16, 11}, | |
67 {4, 3}, | |
68 }; | |
69 | |
70 static const AVRational dirac_frame_rate[] = { | |
71 {15000, 1001}, | |
72 {25, 2}, | |
73 }; | |
74 | |
75 static const struct { | |
76 uint8_t bitdepth; | |
77 enum AVColorRange color_range; | |
78 } pixel_range_presets[] = { | |
79 {8, AVCOL_RANGE_JPEG}, | |
80 {8, AVCOL_RANGE_MPEG}, | |
81 {10, AVCOL_RANGE_MPEG}, | |
82 {12, AVCOL_RANGE_MPEG}, | |
83 }; | |
84 | |
85 static const enum AVColorPrimaries dirac_primaries[] = { | |
86 AVCOL_PRI_BT709, | |
87 AVCOL_PRI_SMPTE170M, | |
88 AVCOL_PRI_BT470BG, | |
89 }; | |
90 | |
91 static const struct { | |
92 enum AVColorPrimaries color_primaries; | |
93 enum AVColorSpace colorspace; | |
94 enum AVColorTransferCharacteristic color_trc; | |
95 } dirac_color_presets[] = { | |
96 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_BT709 }, | |
97 { AVCOL_PRI_SMPTE170M, AVCOL_SPC_BT470BG, AVCOL_TRC_BT709 }, | |
98 { AVCOL_PRI_BT470BG, AVCOL_SPC_BT470BG, AVCOL_TRC_BT709 }, | |
99 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_BT709 }, | |
100 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_UNSPECIFIED /* DCinema */ }, | |
101 }; | |
102 | |
103 static const enum PixelFormat dirac_pix_fmt[2][3] = { | |
104 { PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV420P }, | |
105 { PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ420P }, | |
106 }; | |
107 | |
108 static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | |
109 dirac_source_params *source) | |
110 { | |
111 AVRational frame_rate = (AVRational){0,0}; | |
112 unsigned luma_depth = 8, luma_offset = 16; | |
113 int idx; | |
114 | |
115 if (get_bits1(gb)) { | |
116 source->width = svq3_get_ue_golomb(gb); | |
117 source->height = svq3_get_ue_golomb(gb); | |
118 } | |
119 | |
120 // chroma subsampling | |
121 if (get_bits1(gb)) | |
122 source->chroma_format = svq3_get_ue_golomb(gb); | |
123 if (source->chroma_format > 2) { | |
124 av_log(avctx, AV_LOG_ERROR, "Unknown chroma format %d\n", | |
125 source->chroma_format); | |
126 return -1; | |
127 } | |
128 | |
129 if (get_bits1(gb)) | |
130 source->interlaced = svq3_get_ue_golomb(gb); | |
131 if (source->interlaced > 1) | |
132 return -1; | |
133 | |
134 // frame rate | |
135 if (get_bits1(gb)) { | |
136 source->frame_rate_index = svq3_get_ue_golomb(gb); | |
137 | |
138 if (source->frame_rate_index > 10) | |
139 return -1; | |
140 | |
141 if (!source->frame_rate_index) { | |
142 frame_rate.num = svq3_get_ue_golomb(gb); | |
143 frame_rate.den = svq3_get_ue_golomb(gb); | |
144 } | |
145 } | |
146 if (source->frame_rate_index > 0) { | |
147 if (source->frame_rate_index <= 8) | |
148 frame_rate = ff_frame_rate_tab[source->frame_rate_index]; | |
149 else | |
150 frame_rate = dirac_frame_rate[source->frame_rate_index-9]; | |
151 } | |
152 av_reduce(&avctx->time_base.num, &avctx->time_base.den, | |
153 frame_rate.den, frame_rate.num, 1<<30); | |
154 | |
155 // aspect ratio | |
156 if (get_bits1(gb)) { | |
157 source->aspect_ratio_index = svq3_get_ue_golomb(gb); | |
158 | |
159 if (source->aspect_ratio_index > 6) | |
160 return -1; | |
161 | |
162 if (!source->aspect_ratio_index) { | |
163 avctx->sample_aspect_ratio.num = svq3_get_ue_golomb(gb); | |
164 avctx->sample_aspect_ratio.den = svq3_get_ue_golomb(gb); | |
165 } | |
166 } | |
167 if (source->aspect_ratio_index > 0) | |
168 avctx->sample_aspect_ratio = | |
169 dirac_preset_aspect_ratios[source->aspect_ratio_index-1]; | |
170 | |
171 if (get_bits1(gb)) { | |
172 source->clean_width = svq3_get_ue_golomb(gb); | |
173 source->clean_height = svq3_get_ue_golomb(gb); | |
174 source->clean_left_offset = svq3_get_ue_golomb(gb); | |
175 source->clean_right_offset = svq3_get_ue_golomb(gb); | |
176 } | |
177 | |
178 // Override signal range. | |
179 if (get_bits1(gb)) { | |
180 source->pixel_range_index = svq3_get_ue_golomb(gb); | |
181 | |
182 if (source->pixel_range_index > 4) | |
183 return -1; | |
184 | |
185 // This assumes either fullrange or MPEG levels only | |
186 if (!source->pixel_range_index) { | |
187 luma_offset = svq3_get_ue_golomb(gb); | |
188 luma_depth = av_log2(svq3_get_ue_golomb(gb))+1; | |
189 svq3_get_ue_golomb(gb); // chroma offset | |
190 svq3_get_ue_golomb(gb); // chroma excursion | |
191 | |
192 avctx->color_range = luma_offset ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; | |
193 } | |
194 } | |
195 if (source->pixel_range_index > 0) { | |
196 idx = source->pixel_range_index-1; | |
197 luma_depth = pixel_range_presets[idx].bitdepth; | |
198 avctx->color_range = pixel_range_presets[idx].color_range; | |
199 } | |
200 | |
201 if (luma_depth > 8) | |
202 av_log(avctx, AV_LOG_WARNING, "Bitdepth greater than 8"); | |
203 | |
204 avctx->pix_fmt = dirac_pix_fmt[!luma_offset][source->chroma_format]; | |
205 | |
206 // color spec | |
207 if (get_bits1(gb)) { | |
208 idx = source->color_spec_index = svq3_get_ue_golomb(gb); | |
209 | |
210 if (source->color_spec_index > 4) | |
211 return -1; | |
212 | |
213 avctx->color_primaries = dirac_color_presets[idx].color_primaries; | |
214 avctx->colorspace = dirac_color_presets[idx].colorspace; | |
215 avctx->color_trc = dirac_color_presets[idx].color_trc; | |
216 | |
217 if (!source->color_spec_index) { | |
218 if (get_bits1(gb)) { | |
219 idx = svq3_get_ue_golomb(gb); | |
220 if (idx < 3) | |
221 avctx->color_primaries = dirac_primaries[idx]; | |
222 } | |
223 | |
224 if (get_bits1(gb)) { | |
225 idx = svq3_get_ue_golomb(gb); | |
226 if (!idx) | |
227 avctx->colorspace = AVCOL_SPC_BT709; | |
228 else if (idx == 1) | |
229 avctx->colorspace = AVCOL_SPC_BT470BG; | |
230 } | |
231 | |
232 if (get_bits1(gb) && !svq3_get_ue_golomb(gb)) | |
233 avctx->color_trc = AVCOL_TRC_BT709; | |
234 } | |
235 } else { | |
236 idx = source->color_spec_index; | |
237 avctx->color_primaries = dirac_color_presets[idx].color_primaries; | |
238 avctx->colorspace = dirac_color_presets[idx].colorspace; | |
239 avctx->color_trc = dirac_color_presets[idx].color_trc; | |
240 } | |
241 | |
242 return 0; | |
243 } | |
244 | |
245 int ff_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | |
246 dirac_source_params *source) | |
247 { | |
248 unsigned version_major, version_minor; | |
249 unsigned video_format, picture_coding_mode; | |
250 | |
251 version_major = svq3_get_ue_golomb(gb); | |
252 version_minor = svq3_get_ue_golomb(gb); | |
253 avctx->profile = svq3_get_ue_golomb(gb); | |
254 avctx->level = svq3_get_ue_golomb(gb); | |
255 video_format = svq3_get_ue_golomb(gb); | |
256 | |
257 if (version_major < 2) | |
258 av_log(avctx, AV_LOG_WARNING, "Stream is old and may not work\n"); | |
259 else if (version_major > 2) | |
260 av_log(avctx, AV_LOG_WARNING, "Stream may have unhandled features\n"); | |
261 | |
262 if (video_format > 20) | |
263 return -1; | |
264 | |
265 // Fill in defaults for the source parameters. | |
266 *source = dirac_source_parameters_defaults[video_format]; | |
267 | |
268 // Override the defaults. | |
269 if (parse_source_parameters(avctx, gb, source)) | |
270 return -1; | |
271 | |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
272 if (av_image_check_size(source->width, source->height, 0, avctx)) |
10838 | 273 return -1; |
274 | |
275 avcodec_set_dimensions(avctx, source->width, source->height); | |
276 | |
277 // currently only used to signal field coding | |
278 picture_coding_mode = svq3_get_ue_golomb(gb); | |
279 if (picture_coding_mode != 0) { | |
280 av_log(avctx, AV_LOG_ERROR, "Unsupported picture coding mode %d", | |
281 picture_coding_mode); | |
282 return -1; | |
283 } | |
284 return 0; | |
285 } |