annotate dirac.c @ 11560:8a4984c5cacc libavcodec

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