2 * Copyright (C) 2007 Marco Gerards <marco@gnu.org>
3 * Copyright (C) 2009 David Conrad
5 * This file is part of FFmpeg.
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.
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.
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
25 * @author Marco Gerards <marco@gnu.org>
31 #include "mpeg12data.h"
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 },
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 },
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 },
60 static const AVRational dirac_preset_aspect_ratios
[] = {
69 static const AVRational dirac_frame_rate
[] = {
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
},
84 static const enum AVColorPrimaries dirac_primaries
[] = {
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 */ },
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
},
107 static int parse_source_parameters(AVCodecContext
*avctx
, GetBitContext
*gb
,
108 dirac_source_params
*source
)
110 AVRational frame_rate
= (AVRational
){0,0};
111 unsigned luma_depth
= 8, luma_offset
= 16;
115 source
->width
= svq3_get_ue_golomb(gb
);
116 source
->height
= svq3_get_ue_golomb(gb
);
119 // chroma subsampling
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
);
129 source
->interlaced
= svq3_get_ue_golomb(gb
);
130 if (source
->interlaced
> 1)
135 source
->frame_rate_index
= svq3_get_ue_golomb(gb
);
137 if (source
->frame_rate_index
> 10)
140 if (!source
->frame_rate_index
) {
141 frame_rate
.num
= svq3_get_ue_golomb(gb
);
142 frame_rate
.den
= svq3_get_ue_golomb(gb
);
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
];
149 frame_rate
= dirac_frame_rate
[source
->frame_rate_index
-9];
151 av_reduce(&avctx
->time_base
.num
, &avctx
->time_base
.den
,
152 frame_rate
.den
, frame_rate
.num
, 1<<30);
156 source
->aspect_ratio_index
= svq3_get_ue_golomb(gb
);
158 if (source
->aspect_ratio_index
> 6)
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
);
166 if (source
->aspect_ratio_index
> 0)
167 avctx
->sample_aspect_ratio
=
168 dirac_preset_aspect_ratios
[source
->aspect_ratio_index
-1];
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
);
177 // Override signal range.
179 source
->pixel_range_index
= svq3_get_ue_golomb(gb
);
181 if (source
->pixel_range_index
> 4)
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
191 avctx
->color_range
= luma_offset
? AVCOL_RANGE_MPEG
: AVCOL_RANGE_JPEG
;
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
;
201 av_log(avctx
, AV_LOG_WARNING
, "Bitdepth greater than 8");
203 avctx
->pix_fmt
= dirac_pix_fmt
[!luma_offset
][source
->chroma_format
];
207 idx
= source
->color_spec_index
= svq3_get_ue_golomb(gb
);
209 if (source
->color_spec_index
> 4)
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
;
216 if (!source
->color_spec_index
) {
218 idx
= svq3_get_ue_golomb(gb
);
220 avctx
->color_primaries
= dirac_primaries
[idx
];
224 idx
= svq3_get_ue_golomb(gb
);
226 avctx
->colorspace
= AVCOL_SPC_BT709
;
228 avctx
->colorspace
= AVCOL_SPC_BT470BG
;
231 if (get_bits1(gb
) && !svq3_get_ue_golomb(gb
))
232 avctx
->color_trc
= AVCOL_TRC_BT709
;
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
;
244 int ff_dirac_parse_sequence_header(AVCodecContext
*avctx
, GetBitContext
*gb
,
245 dirac_source_params
*source
)
247 unsigned version_major
, version_minor
;
248 unsigned video_format
, picture_coding_mode
;
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
);
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");
261 if (video_format
> 20)
264 // Fill in defaults for the source parameters.
265 *source
= dirac_source_parameters_defaults
[video_format
];
267 // Override the defaults.
268 if (parse_source_parameters(avctx
, gb
, source
))
271 if (avcodec_check_dimensions(avctx
, source
->width
, source
->height
))
274 avcodec_set_dimensions(avctx
, source
->width
, source
->height
);
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
);