Skip to content
Snippets Groups Projects
Commit c14b5aa6 authored by François Cartegnie's avatar François Cartegnie :fingers_crossed:
Browse files

packetizer: flac: fix CRC from emulated sync

also skips some memcpy

refs #27454 #27477
parent cb4464dd
No related branches found
No related tags found
1 merge request!2799packetizer: flac: fix CRC from emulated sync
Pipeline #281107 passed with stage
in 1 hour, 2 minutes, and 21 seconds
......@@ -77,6 +77,7 @@ typedef struct
size_t i_last_frame_size;
uint16_t crc;
size_t i_buf_offset; /* in final buffer before crc check / validation / retry */
size_t i_buf;
uint8_t *p_buf;
......@@ -385,6 +386,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
p_sys->headerinfo = headerinfo;
p_sys->i_state = STATE_NEXT_SYNC;
p_sys->i_offset = FLAC_FRAME_SIZE_MIN;
p_sys->i_buf_offset = 0;
p_sys->crc = 0;
/* We have to read until next frame sync code to compute current frame size
......@@ -460,6 +462,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
block_SkipBytes( &p_sys->bytestream, FLAC_HEADER_SIZE_MAX + 2 );
block_BytestreamFlush( &p_sys->bytestream );
p_sys->crc = 0;
p_sys->i_buf_offset = 0;
p_sys->i_offset = 0;
p_sys->i_state = STATE_NOSYNC;
p_sys->i_next_block_flags |= BLOCK_FLAG_DISCONTINUITY;
......@@ -483,10 +486,12 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
}
/* Copy from previous sync point up to to current (offset) */
block_PeekOffsetBytes( &p_sys->bytestream, 0, p_sys->p_buf, p_sys->i_offset );
block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_buf_offset,
&p_sys->p_buf[p_sys->i_buf_offset],
p_sys->i_offset - p_sys->i_buf_offset );
/* update crc to include this data chunk */
for( size_t i = 0; i < p_sys->i_offset - 2; i++ )
for( size_t i = p_sys->i_buf_offset; i < p_sys->i_offset - 2; i++ )
p_sys->crc = flac_crc16( p_sys->crc, p_sys->p_buf[i] );
uint16_t stream_crc = GetWBE(&p_sys->p_buf[p_sys->i_offset - 2]);
......@@ -496,6 +501,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
/* Add the 2 last bytes which were not the CRC sum, and go for next sync point */
p_sys->crc = flac_crc16( p_sys->crc, p_sys->p_buf[p_sys->i_offset - 2] );
p_sys->crc = flac_crc16( p_sys->crc, p_sys->p_buf[p_sys->i_offset - 1] );
p_sys->i_buf_offset = p_sys->i_offset;
p_sys->i_offset += 1;
p_sys->i_state = !pp_block ? STATE_NOSYNC : STATE_NEXT_SYNC;
break; /* continue */
......@@ -512,6 +518,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
block_BytestreamFlush( &p_sys->bytestream );
p_sys->i_offset = 0;
p_sys->crc = 0;
p_sys->i_buf_offset = 0;
if( block_BytestreamRemaining(&p_sys->bytestream) > 0 || pp_block == NULL /* drain */)
p_sys->i_state = STATE_SEND_DATA;
......@@ -551,6 +558,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
else
free( p_sys->p_buf );
p_sys->i_buf_offset = 0;
p_sys->i_buf = 0;
p_sys->p_buf = NULL;
p_sys->i_offset = 0;
......@@ -585,6 +593,7 @@ static int Open(vlc_object_t *p_this)
p_sys->b_stream_info = false;
p_sys->i_last_frame_size = FLAC_FRAME_SIZE_MIN;
p_sys->headerinfo.i_pts = VLC_TICK_INVALID;
p_sys->i_buf_offset = 0;
p_sys->i_buf = 0;
p_sys->p_buf = NULL;
p_sys->i_next_block_flags = 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment