annotate dirac.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents ffb3668ff7af
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 10838
diff changeset
23 * @file
10838
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
12372
914f484bb476 Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents: 11644
diff changeset
28 #include "libavcore/imgutils.h"
10838
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
29 #include "dirac.h"
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
30 #include "avcodec.h"
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
31 #include "golomb.h"
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
32 #include "mpeg12data.h"
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
33
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
34 // defaults for source parameters
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
35 static const dirac_source_params dirac_source_parameters_defaults[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
36 { 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
37 { 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
38 { 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
39 { 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
40 { 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
41 { 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
42 { 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
43 { 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
44 { 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
45
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
46 { 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
47 { 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
48 { 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
49 { 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
50 { 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
51 { 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
52 { 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
53 { 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
54
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
55 { 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
56 { 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
57 { 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
58 { 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
59 };
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
60
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
61 static const AVRational dirac_preset_aspect_ratios[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
62 {1, 1},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
63 {10, 11},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
64 {12, 11},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
65 {40, 33},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
66 {16, 11},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
67 {4, 3},
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
70 static const AVRational dirac_frame_rate[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
71 {15000, 1001},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
72 {25, 2},
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
75 static const struct {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
76 uint8_t bitdepth;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
77 enum AVColorRange color_range;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
78 } pixel_range_presets[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
79 {8, AVCOL_RANGE_JPEG},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
80 {8, AVCOL_RANGE_MPEG},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
81 {10, AVCOL_RANGE_MPEG},
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
82 {12, AVCOL_RANGE_MPEG},
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
85 static const enum AVColorPrimaries dirac_primaries[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
86 AVCOL_PRI_BT709,
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
87 AVCOL_PRI_SMPTE170M,
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
88 AVCOL_PRI_BT470BG,
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
91 static const struct {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
92 enum AVColorPrimaries color_primaries;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
93 enum AVColorSpace colorspace;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
94 enum AVColorTransferCharacteristic color_trc;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
95 } dirac_color_presets[] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
96 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_BT709 },
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
97 { AVCOL_PRI_SMPTE170M, AVCOL_SPC_BT470BG, AVCOL_TRC_BT709 },
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
98 { AVCOL_PRI_BT470BG, AVCOL_SPC_BT470BG, 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_BT709 },
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
100 { AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_UNSPECIFIED /* DCinema */ },
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
103 static const enum PixelFormat dirac_pix_fmt[2][3] = {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
104 { PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV420P },
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
105 { PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ420P },
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
108 static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
109 dirac_source_params *source)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
110 {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
111 AVRational frame_rate = (AVRational){0,0};
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
112 unsigned luma_depth = 8, luma_offset = 16;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
113 int idx;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
114
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
115 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
116 source->width = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
117 source->height = svq3_get_ue_golomb(gb);
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
120 // chroma subsampling
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
121 if (get_bits1(gb))
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
122 source->chroma_format = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
123 if (source->chroma_format > 2) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
124 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
125 source->chroma_format);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
126 return -1;
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
129 if (get_bits1(gb))
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
130 source->interlaced = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
131 if (source->interlaced > 1)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
132 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
133
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
134 // frame rate
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
135 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
136 source->frame_rate_index = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
137
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
138 if (source->frame_rate_index > 10)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
139 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
140
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
141 if (!source->frame_rate_index) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
142 frame_rate.num = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
143 frame_rate.den = svq3_get_ue_golomb(gb);
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 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
146 if (source->frame_rate_index > 0) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
147 if (source->frame_rate_index <= 8)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
148 frame_rate = ff_frame_rate_tab[source->frame_rate_index];
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
149 else
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
150 frame_rate = dirac_frame_rate[source->frame_rate_index-9];
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
151 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
152 av_reduce(&avctx->time_base.num, &avctx->time_base.den,
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
153 frame_rate.den, frame_rate.num, 1<<30);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
154
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
155 // aspect ratio
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
156 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
157 source->aspect_ratio_index = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
158
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
159 if (source->aspect_ratio_index > 6)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
160 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
161
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
162 if (!source->aspect_ratio_index) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
163 avctx->sample_aspect_ratio.num = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
164 avctx->sample_aspect_ratio.den = svq3_get_ue_golomb(gb);
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 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
167 if (source->aspect_ratio_index > 0)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
168 avctx->sample_aspect_ratio =
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
169 dirac_preset_aspect_ratios[source->aspect_ratio_index-1];
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
170
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
171 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
172 source->clean_width = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
173 source->clean_height = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
174 source->clean_left_offset = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
175 source->clean_right_offset = svq3_get_ue_golomb(gb);
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
178 // Override signal range.
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
179 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
180 source->pixel_range_index = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
181
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
182 if (source->pixel_range_index > 4)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
183 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
184
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
185 // This assumes either fullrange or MPEG levels only
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
186 if (!source->pixel_range_index) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
187 luma_offset = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
188 luma_depth = av_log2(svq3_get_ue_golomb(gb))+1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
189 svq3_get_ue_golomb(gb); // chroma offset
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
190 svq3_get_ue_golomb(gb); // chroma excursion
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
191
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
192 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
193 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
194 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
195 if (source->pixel_range_index > 0) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
196 idx = source->pixel_range_index-1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
197 luma_depth = pixel_range_presets[idx].bitdepth;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
198 avctx->color_range = pixel_range_presets[idx].color_range;
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
201 if (luma_depth > 8)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
202 av_log(avctx, AV_LOG_WARNING, "Bitdepth greater than 8");
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
203
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
204 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
205
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
206 // color spec
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
207 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
208 idx = source->color_spec_index = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
209
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
210 if (source->color_spec_index > 4)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
211 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
212
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
213 avctx->color_primaries = dirac_color_presets[idx].color_primaries;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
214 avctx->colorspace = dirac_color_presets[idx].colorspace;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
215 avctx->color_trc = dirac_color_presets[idx].color_trc;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
216
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
217 if (!source->color_spec_index) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
218 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
219 idx = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
220 if (idx < 3)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
221 avctx->color_primaries = dirac_primaries[idx];
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
224 if (get_bits1(gb)) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
225 idx = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
226 if (!idx)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
227 avctx->colorspace = AVCOL_SPC_BT709;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
228 else if (idx == 1)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
229 avctx->colorspace = AVCOL_SPC_BT470BG;
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
232 if (get_bits1(gb) && !svq3_get_ue_golomb(gb))
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
233 avctx->color_trc = AVCOL_TRC_BT709;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
234 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
235 } else {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
236 idx = source->color_spec_index;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
237 avctx->color_primaries = dirac_color_presets[idx].color_primaries;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
238 avctx->colorspace = dirac_color_presets[idx].colorspace;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
239 avctx->color_trc = dirac_color_presets[idx].color_trc;
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
242 return 0;
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
245 int ff_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
246 dirac_source_params *source)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
247 {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
248 unsigned version_major, version_minor;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
249 unsigned video_format, picture_coding_mode;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
250
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
251 version_major = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
252 version_minor = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
253 avctx->profile = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
254 avctx->level = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
255 video_format = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
256
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
257 if (version_major < 2)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
258 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
259 else if (version_major > 2)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
260 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
261
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
262 if (video_format > 20)
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
263 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
264
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
265 // Fill in defaults for the source parameters.
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
266 *source = dirac_source_parameters_defaults[video_format];
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
267
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
268 // Override the defaults.
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
269 if (parse_source_parameters(avctx, gb, source))
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
270 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
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
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
273 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
274
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
275 avcodec_set_dimensions(avctx, source->width, source->height);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
276
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
277 // currently only used to signal field coding
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
278 picture_coding_mode = svq3_get_ue_golomb(gb);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
279 if (picture_coding_mode != 0) {
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
280 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
281 picture_coding_mode);
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
282 return -1;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
283 }
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
284 return 0;
95dac0e4703b Add a function to parse Dirac's sequence header
conrad
parents:
diff changeset
285 }