This prevents potential ABI issues with GetBitContext.
Reviewed-by: foo86 <foobaz86@gmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
... | ... |
@@ -88,7 +88,7 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, |
88 | 88 |
} |
89 | 89 |
} |
90 | 90 |
|
91 |
-int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h) |
|
91 |
+int ff_dca_parse_core_frame_header(DCACoreFrameHeader *h, GetBitContext *gb) |
|
92 | 92 |
{ |
93 | 93 |
if (get_bits_long(gb, 32) != DCA_SYNCWORD_CORE_BE) |
94 | 94 |
return DCA_PARSE_ERROR_SYNC_WORD; |
... | ... |
@@ -145,3 +145,13 @@ int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h) |
145 | 145 |
h->dn_code = get_bits(gb, 4); |
146 | 146 |
return 0; |
147 | 147 |
} |
148 |
+ |
|
149 |
+int avpriv_dca_parse_core_frame_header(DCACoreFrameHeader *h, uint8_t *buf, int size) |
|
150 |
+{ |
|
151 |
+ GetBitContext gb; |
|
152 |
+ |
|
153 |
+ if (init_get_bits8(&gb, buf, size) < 0) |
|
154 |
+ return DCA_PARSE_ERROR_INVALIDDATA; |
|
155 |
+ |
|
156 |
+ return ff_dca_parse_core_frame_header(h, &gb); |
|
157 |
+} |
... | ... |
@@ -45,7 +45,8 @@ enum DCAParseError { |
45 | 45 |
DCA_PARSE_ERROR_SAMPLE_RATE = -6, |
46 | 46 |
DCA_PARSE_ERROR_RESERVED_BIT = -7, |
47 | 47 |
DCA_PARSE_ERROR_LFE_FLAG = -8, |
48 |
- DCA_PARSE_ERROR_PCM_RES = -9 |
|
48 |
+ DCA_PARSE_ERROR_PCM_RES = -9, |
|
49 |
+ DCA_PARSE_ERROR_INVALIDDATA = -10, |
|
49 | 50 |
}; |
50 | 51 |
|
51 | 52 |
typedef struct DCACoreFrameHeader { |
... | ... |
@@ -212,6 +213,8 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, |
212 | 212 |
* Parse and validate core frame header |
213 | 213 |
* @return 0 on success, negative DCA_PARSE_ERROR_ code on failure |
214 | 214 |
*/ |
215 |
-int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h); |
|
215 |
+int avpriv_dca_parse_core_frame_header(DCACoreFrameHeader *h, uint8_t *buf, int size); |
|
216 |
+ |
|
217 |
+int ff_dca_parse_core_frame_header(DCACoreFrameHeader *h, GetBitContext *gb); |
|
216 | 218 |
|
217 | 219 |
#endif /* AVCODEC_DCA_H */ |
... | ... |
@@ -82,7 +82,7 @@ static void get_array(GetBitContext *s, int32_t *array, int size, int n) |
82 | 82 |
static int parse_frame_header(DCACoreDecoder *s) |
83 | 83 |
{ |
84 | 84 |
DCACoreFrameHeader h = { 0 }; |
85 |
- int err = avpriv_dca_parse_core_frame_header(&s->gb, &h); |
|
85 |
+ int err = ff_dca_parse_core_frame_header(&h, &s->gb); |
|
86 | 86 |
|
87 | 87 |
if (err < 0) { |
88 | 88 |
switch (err) { |
... | ... |
@@ -263,9 +263,7 @@ static int dca_parse_params(DCAParseContext *pc1, const uint8_t *buf, |
263 | 263 |
if ((ret = avpriv_dca_convert_bitstream(buf, DCA_CORE_FRAME_HEADER_SIZE, |
264 | 264 |
hdr, DCA_CORE_FRAME_HEADER_SIZE)) < 0) |
265 | 265 |
return ret; |
266 |
- if ((ret = init_get_bits8(&gb, hdr, ret)) < 0) |
|
267 |
- return ret; |
|
268 |
- if (avpriv_dca_parse_core_frame_header(&gb, &h) < 0) |
|
266 |
+ if (avpriv_dca_parse_core_frame_header(&h, hdr, ret) < 0) |
|
269 | 267 |
return AVERROR_INVALIDDATA; |
270 | 268 |
|
271 | 269 |
*duration = h.npcmblocks * DCA_PCMBLOCK_SAMPLES; |
... | ... |
@@ -101,9 +101,7 @@ static int dts_probe(AVProbeData *p) |
101 | 101 |
if ((ret = avpriv_dca_convert_bitstream(buf - 2, DCA_CORE_FRAME_HEADER_SIZE, |
102 | 102 |
hdr, DCA_CORE_FRAME_HEADER_SIZE)) < 0) |
103 | 103 |
continue; |
104 |
- if (init_get_bits8(&gb, hdr, ret) < 0) |
|
105 |
- continue; |
|
106 |
- if (avpriv_dca_parse_core_frame_header(&gb, &h) < 0) |
|
104 |
+ if (avpriv_dca_parse_core_frame_header(&h, hdr, ret) < 0) |
|
107 | 105 |
continue; |
108 | 106 |
|
109 | 107 |
marker += 4 * h.sr_code; |