Mercurial > libavcodec.hg
annotate dirac.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 7dd2a45249a9 |
children | 914f484bb476 |
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 | |
28 #include "dirac.h" | |
29 #include "avcodec.h" | |
30 #include "golomb.h" | |
31 #include "mpeg12data.h" | |
32 | |
33 // defaults for source parameters | |
34 static const dirac_source_params dirac_source_parameters_defaults[] = { | |
35 { 640, 480, 2, 0, 0, 1, 1, 640, 480, 0, 0, 1, 0 }, | |
36 { 176, 120, 2, 0, 0, 9, 2, 176, 120, 0, 0, 1, 1 }, | |
37 { 176, 144, 2, 0, 1, 10, 3, 176, 144, 0, 0, 1, 2 }, | |
38 { 352, 240, 2, 0, 0, 9, 2, 352, 240, 0, 0, 1, 1 }, | |
39 { 352, 288, 2, 0, 1, 10, 3, 352, 288, 0, 0, 1, 2 }, | |
40 { 704, 480, 2, 0, 0, 9, 2, 704, 480, 0, 0, 1, 1 }, | |
41 { 704, 576, 2, 0, 1, 10, 3, 704, 576, 0, 0, 1, 2 }, | |
42 { 720, 480, 1, 1, 0, 4, 2, 704, 480, 8, 0, 3, 1 }, | |
43 { 720, 576, 1, 1, 1, 3, 3, 704, 576, 8, 0, 3, 2 }, | |
44 | |
45 { 1280, 720, 1, 0, 1, 7, 1, 1280, 720, 0, 0, 3, 3 }, | |
46 { 1280, 720, 1, 0, 1, 6, 1, 1280, 720, 0, 0, 3, 3 }, | |
47 { 1920, 1080, 1, 1, 1, 4, 1, 1920, 1080, 0, 0, 3, 3 }, | |
48 { 1920, 1080, 1, 1, 1, 3, 1, 1920, 1080, 0, 0, 3, 3 }, | |
49 { 1920, 1080, 1, 0, 1, 7, 1, 1920, 1080, 0, 0, 3, 3 }, | |
50 { 1920, 1080, 1, 0, 1, 6, 1, 1920, 1080, 0, 0, 3, 3 }, | |
51 { 2048, 1080, 0, 0, 1, 2, 1, 2048, 1080, 0, 0, 4, 4 }, | |
52 { 4096, 2160, 0, 0, 1, 2, 1, 4096, 2160, 0, 0, 4, 4 }, | |
53 | |
54 { 3840, 2160, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, | |
55 { 3840, 2160, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, | |
56 { 7680, 4320, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, | |
57 { 7680, 4320, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, | |
58 }; | |
59 | |
60 static const AVRational dirac_preset_aspect_ratios[] = { | |
61 {1, 1}, | |
62 {10, 11}, | |
63 {12, 11}, | |
64 {40, 33}, | |
65 {16, 11}, | |
66 {4, 3}, | |
67 }; | |
68 | |
69 static const AVRational dirac_frame_rate[] = { | |
70 {15000, 1001}, | |
71 {25, 2}, | |
72 }; | |
73 | |
74 static const struct { | |
75 uint8_t bitdepth; | |
76 enum AVColorRange color_range; | |
77 } pixel_range_presets[] = { | |
78 {8, AVCOL_RANGE_JPEG}, | |
79 {8, AVCOL_RANGE_MPEG}, | |
80 {10, AVCOL_RANGE_MPEG}, | |
81 {12, AVCOL_RANGE_MPEG}, | |
82 }; | |
83 | |
84 static const enum AVColorPrimaries dirac_primaries[] = { | |
85 AVCOL_PRI_BT709, | |
86 AVCOL_PRI_SMPTE170M, | |
87 AVCOL_PRI_BT470BG, | |
88 }; | |
89 | |
90 static const struct { | |
91 enum AVColorPrimaries color_primaries; | |
92 enum AVColorSpace colorspace; | |
93 enum AVColorTransferCharacteristic color_trc; | |
94 } dirac_color_presets[] = { | |
95 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_BT709 }, | |
96 { AVCOL_PRI_SMPTE170M, AVCOL_SPC_BT470BG, AVCOL_TRC_BT709 }, | |
97 { AVCOL_PRI_BT470BG, AVCOL_SPC_BT470BG, AVCOL_TRC_BT709 }, | |
98 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_BT709 }, | |
99 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_UNSPECIFIED /* DCinema */ }, | |
100 }; | |
101 | |
102 static const enum PixelFormat dirac_pix_fmt[2][3] = { | |
103 { PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV420P }, | |
104 { PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ420P }, | |
105 }; | |
106 | |
107 static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | |
108 dirac_source_params *source) | |
109 { | |
110 AVRational frame_rate = (AVRational){0,0}; | |
111 unsigned luma_depth = 8, luma_offset = 16; | |
112 int idx; | |
113 | |
114 if (get_bits1(gb)) { | |
115 source->width = svq3_get_ue_golomb(gb); | |
116 source->height = svq3_get_ue_golomb(gb); | |
117 } | |
118 | |
119 // chroma subsampling | |
120 if (get_bits1(gb)) | |
121 source->chroma_format = svq3_get_ue_golomb(gb); | |
122 if (source->chroma_format > 2) { | |
123 av_log(avctx, AV_LOG_ERROR, "Unknown chroma format %d\n", | |
124 source->chroma_format); | |
125 return -1; | |
126 } | |
127 | |
128 if (get_bits1(gb)) | |
129 source->interlaced = svq3_get_ue_golomb(gb); | |
130 if (source->interlaced > 1) | |
131 return -1; | |
132 | |
133 // frame rate | |
134 if (get_bits1(gb)) { | |
135 source->frame_rate_index = svq3_get_ue_golomb(gb); | |
136 | |
137 if (source->frame_rate_index > 10) | |
138 return -1; | |
139 | |
140 if (!source->frame_rate_index) { | |
141 frame_rate.num = svq3_get_ue_golomb(gb); | |
142 frame_rate.den = svq3_get_ue_golomb(gb); | |
143 } | |
144 } | |
145 if (source->frame_rate_index > 0) { | |
146 if (source->frame_rate_index <= 8) | |
147 frame_rate = ff_frame_rate_tab[source->frame_rate_index]; | |
148 else | |
149 frame_rate = dirac_frame_rate[source->frame_rate_index-9]; | |
150 } | |
151 av_reduce(&avctx->time_base.num, &avctx->time_base.den, | |
152 frame_rate.den, frame_rate.num, 1<<30); | |
153 | |
154 // aspect ratio | |
155 if (get_bits1(gb)) { | |
156 source->aspect_ratio_index = svq3_get_ue_golomb(gb); | |
157 | |
158 if (source->aspect_ratio_index > 6) | |
159 return -1; | |
160 | |
161 if (!source->aspect_ratio_index) { | |
162 avctx->sample_aspect_ratio.num = svq3_get_ue_golomb(gb); | |
163 avctx->sample_aspect_ratio.den = svq3_get_ue_golomb(gb); | |
164 } | |
165 } | |
166 if (source->aspect_ratio_index > 0) | |
167 avctx->sample_aspect_ratio = | |
168 dirac_preset_aspect_ratios[source->aspect_ratio_index-1]; | |
169 | |
170 if (get_bits1(gb)) { | |
171 source->clean_width = svq3_get_ue_golomb(gb); | |
172 source->clean_height = svq3_get_ue_golomb(gb); | |
173 source->clean_left_offset = svq3_get_ue_golomb(gb); | |
174 source->clean_right_offset = svq3_get_ue_golomb(gb); | |
175 } | |
176 | |
177 // Override signal range. | |
178 if (get_bits1(gb)) { | |
179 source->pixel_range_index = svq3_get_ue_golomb(gb); | |
180 | |
181 if (source->pixel_range_index > 4) | |
182 return -1; | |
183 | |
184 // This assumes either fullrange or MPEG levels only | |
185 if (!source->pixel_range_index) { | |
186 luma_offset = svq3_get_ue_golomb(gb); | |
187 luma_depth = av_log2(svq3_get_ue_golomb(gb))+1; | |
188 svq3_get_ue_golomb(gb); // chroma offset | |
189 svq3_get_ue_golomb(gb); // chroma excursion | |
190 | |
191 avctx->color_range = luma_offset ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; | |
192 } | |
193 } | |
194 if (source->pixel_range_index > 0) { | |
195 idx = source->pixel_range_index-1; | |
196 luma_depth = pixel_range_presets[idx].bitdepth; | |
197 avctx->color_range = pixel_range_presets[idx].color_range; | |
198 } | |
199 | |
200 if (luma_depth > 8) | |
201 av_log(avctx, AV_LOG_WARNING, "Bitdepth greater than 8"); | |
202 | |
203 avctx->pix_fmt = dirac_pix_fmt[!luma_offset][source->chroma_format]; | |
204 | |
205 // color spec | |
206 if (get_bits1(gb)) { | |
207 idx = source->color_spec_index = svq3_get_ue_golomb(gb); | |
208 | |
209 if (source->color_spec_index > 4) | |
210 return -1; | |
211 | |
212 avctx->color_primaries = dirac_color_presets[idx].color_primaries; | |
213 avctx->colorspace = dirac_color_presets[idx].colorspace; | |
214 avctx->color_trc = dirac_color_presets[idx].color_trc; | |
215 | |
216 if (!source->color_spec_index) { | |
217 if (get_bits1(gb)) { | |
218 idx = svq3_get_ue_golomb(gb); | |
219 if (idx < 3) | |
220 avctx->color_primaries = dirac_primaries[idx]; | |
221 } | |
222 | |
223 if (get_bits1(gb)) { | |
224 idx = svq3_get_ue_golomb(gb); | |
225 if (!idx) | |
226 avctx->colorspace = AVCOL_SPC_BT709; | |
227 else if (idx == 1) | |
228 avctx->colorspace = AVCOL_SPC_BT470BG; | |
229 } | |
230 | |
231 if (get_bits1(gb) && !svq3_get_ue_golomb(gb)) | |
232 avctx->color_trc = AVCOL_TRC_BT709; | |
233 } | |
234 } else { | |
235 idx = source->color_spec_index; | |
236 avctx->color_primaries = dirac_color_presets[idx].color_primaries; | |
237 avctx->colorspace = dirac_color_presets[idx].colorspace; | |
238 avctx->color_trc = dirac_color_presets[idx].color_trc; | |
239 } | |
240 | |
241 return 0; | |
242 } | |
243 | |
244 int ff_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | |
245 dirac_source_params *source) | |
246 { | |
247 unsigned version_major, version_minor; | |
248 unsigned video_format, picture_coding_mode; | |
249 | |
250 version_major = svq3_get_ue_golomb(gb); | |
251 version_minor = svq3_get_ue_golomb(gb); | |
252 avctx->profile = svq3_get_ue_golomb(gb); | |
253 avctx->level = svq3_get_ue_golomb(gb); | |
254 video_format = svq3_get_ue_golomb(gb); | |
255 | |
256 if (version_major < 2) | |
257 av_log(avctx, AV_LOG_WARNING, "Stream is old and may not work\n"); | |
258 else if (version_major > 2) | |
259 av_log(avctx, AV_LOG_WARNING, "Stream may have unhandled features\n"); | |
260 | |
261 if (video_format > 20) | |
262 return -1; | |
263 | |
264 // Fill in defaults for the source parameters. | |
265 *source = dirac_source_parameters_defaults[video_format]; | |
266 | |
267 // Override the defaults. | |
268 if (parse_source_parameters(avctx, gb, source)) | |
269 return -1; | |
270 | |
271 if (avcodec_check_dimensions(avctx, source->width, source->height)) | |
272 return -1; | |
273 | |
274 avcodec_set_dimensions(avctx, source->width, source->height); | |
275 | |
276 // currently only used to signal field coding | |
277 picture_coding_mode = svq3_get_ue_golomb(gb); | |
278 if (picture_coding_mode != 0) { | |
279 av_log(avctx, AV_LOG_ERROR, "Unsupported picture coding mode %d", | |
280 picture_coding_mode); | |
281 return -1; | |
282 } | |
283 return 0; | |
284 } |