1 /*
2  * Copyright (C) 2007 Marco Gerards <marco@gnu.org>
3  * Copyright (C) 2009 David Conrad
4  * Copyright (C) 2011 Jordi Ortiz
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 module ffmpeg.libavcodec.dirac;
23 
24 import ffmpeg.libavcodec;
25 import ffmpeg.libavutil;
26 
27 extern (C) @nogc nothrow:
28 
29 /**
30  * @file
31  * Interface to Dirac Decoder/Encoder
32  * @author Marco Gerards <marco@gnu.org>
33  * @author David Conrad
34  * @author Jordi Ortiz
35  */
36 
37 /**
38  * The spec limits the number of wavelet decompositions to 4 for both
39  * level 1 (VC-2) and 128 (long-gop default).
40  * 5 decompositions is the maximum before >16-bit buffers are needed.
41  * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting
42  * the others to 4 decompositions (or 3 for the fidelity filter).
43  *
44  * We use this instead of MAX_DECOMPOSITIONS to save some memory.
45  */
46 enum MAX_DWT_LEVELS = 5;
47 
48 /**
49  * Parse code values:
50  *
51  * Dirac Specification ->
52  * 9.6.1  Table 9.1
53  *
54  * VC-2 Specification  ->
55  * 10.4.1 Table 10.1
56  */
57 
58 enum DiracParseCodes
59 {
60     DIRAC_PCODE_SEQ_HEADER = 0x00,
61     DIRAC_PCODE_END_SEQ = 0x10,
62     DIRAC_PCODE_AUX = 0x20,
63     DIRAC_PCODE_PAD = 0x30,
64     DIRAC_PCODE_PICTURE_CODED = 0x08,
65     DIRAC_PCODE_PICTURE_RAW = 0x48,
66     DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8,
67     DIRAC_PCODE_PICTURE_HQ = 0xE8,
68     DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A,
69     DIRAC_PCODE_INTER_NOREF_CO2 = 0x09,
70     DIRAC_PCODE_INTER_REF_CO1 = 0x0D,
71     DIRAC_PCODE_INTER_REF_CO2 = 0x0E,
72     DIRAC_PCODE_INTRA_REF_CO = 0x0C,
73     DIRAC_PCODE_INTRA_REF_RAW = 0x4C,
74     DIRAC_PCODE_INTRA_REF_PICT = 0xCC,
75     DIRAC_PCODE_MAGIC = 0x42424344
76 }
77 
78 struct DiracVersionInfo
79 {
80     int major;
81     int minor;
82 }
83 
84 struct AVDiracSeqHeader
85 {
86     uint width;
87     uint height;
88     ubyte chroma_format; ///< 0: 444  1: 422  2: 420
89 
90     ubyte interlaced;
91     ubyte top_field_first;
92 
93     ubyte frame_rate_index; ///< index into dirac_frame_rate[]
94     ubyte aspect_ratio_index; ///< index into dirac_aspect_ratio[]
95 
96     ushort clean_width;
97     ushort clean_height;
98     ushort clean_left_offset;
99     ushort clean_right_offset;
100 
101     ubyte pixel_range_index; ///< index into dirac_pixel_range_presets[]
102     ubyte color_spec_index; ///< index into dirac_color_spec_presets[]
103 
104     int profile;
105     int level;
106 
107     AVRational framerate;
108     AVRational sample_aspect_ratio;
109 
110     AVPixelFormat pix_fmt;
111     AVColorRange color_range;
112     AVColorPrimaries color_primaries;
113     AVColorTransferCharacteristic color_trc;
114     AVColorSpace colorspace;
115 
116     DiracVersionInfo version_;
117     int bit_depth;
118 }
119 
120 /**
121  * Parse a Dirac sequence header.
122  *
123  * @param dsh this function will allocate and fill an AVDiracSeqHeader struct
124  *            and write it into this pointer. The caller must free it with
125  *            av_free().
126  * @param buf the data buffer
127  * @param buf_size the size of the data buffer in bytes
128  * @param log_ctx if non-NULL, this function will log errors here
129  * @return 0 on success, a negative AVERROR code on failure
130  */
131 int av_dirac_parse_sequence_header (
132     AVDiracSeqHeader** dsh,
133     const(ubyte)* buf,
134     size_t buf_size,
135     void* log_ctx);
136 
137 /* AVCODEC_DIRAC_H */