mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-05 23:00:02 +00:00
dirac_parser: Improve parsing and silence pointless warnings
The parser scans for "BBCD" to appear in the bitstream which indicate a parse info header and once that happens, checks if the parse offsets are sane. Since random BBCD strings might appear in the bitstream the parser will emit a pointless warning if that happens. This commit improves parsing by checking for a valid parse code as well as keeping the original checks for valid parse offsets. The warnings were removed as they serve no real purpose. Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
parent
b65efbc0f4
commit
a849ebb54e
@ -100,7 +100,11 @@ typedef struct DiracParseUnit {
|
||||
static int unpack_parse_unit(DiracParseUnit *pu, DiracParseContext *pc,
|
||||
int offset)
|
||||
{
|
||||
int i;
|
||||
int8_t *start;
|
||||
static const uint8_t valid_pu_types[] = {
|
||||
0x00, 0x10, 0x20, 0x30, 0x08, 0x48, 0xC8, 0xE8
|
||||
};
|
||||
|
||||
if (offset < 0 || pc->index - 13 < offset)
|
||||
return 0;
|
||||
@ -111,17 +115,20 @@ static int unpack_parse_unit(DiracParseUnit *pu, DiracParseContext *pc,
|
||||
pu->next_pu_offset = AV_RB32(start + 5);
|
||||
pu->prev_pu_offset = AV_RB32(start + 9);
|
||||
|
||||
if (pu->pu_type == 0x10 && pu->next_pu_offset == 0)
|
||||
pu->next_pu_offset = 13;
|
||||
/* Check for valid parse code */
|
||||
for (i = 0; i < 8; i++)
|
||||
if (valid_pu_types[i] == pu->pu_type)
|
||||
break;
|
||||
if (i == 8)
|
||||
return 0;
|
||||
|
||||
if (pu->next_pu_offset && pu->next_pu_offset < 13) {
|
||||
av_log(NULL, AV_LOG_ERROR, "next_pu_offset %d is invalid\n", pu->next_pu_offset);
|
||||
if (pu->pu_type == 0x10 && pu->next_pu_offset == 0)
|
||||
pu->next_pu_offset = 13; /* The length of a parse info header */
|
||||
|
||||
/* Check if the parse offsets are somewhat sane */
|
||||
if ((pu->next_pu_offset && pu->next_pu_offset < 13) ||
|
||||
(pu->prev_pu_offset && pu->prev_pu_offset < 13))
|
||||
return 0;
|
||||
}
|
||||
if (pu->prev_pu_offset && pu->prev_pu_offset < 13) {
|
||||
av_log(NULL, AV_LOG_ERROR, "prev_pu_offset %d is invalid\n", pu->prev_pu_offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user