vlc/vlc-3.0 | branch: master | Francois Cartegnie <[email protected]> | Wed Dec 19 19:47:55 2018 +0100| [2d00056a3174c2d140a50ce085793e9b81b3ca97] | committer: Francois Cartegnie
packetizer: flac: check next header refs #21498 (cherry picked from commit dfe7d4c1a38572e8b6735393b69ba35284cc1d65) > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=2d00056a3174c2d140a50ce085793e9b81b3ca97 --- NEWS | 1 + modules/packetizer/flac.c | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 93dae58f59..16132d1413 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ Demux: Packetizers: * Fixes H264/HEVC incomplete draining in some cases * packetizer_helper: Fix potential trailing junk on last packet + * Improved check to prevent fLAC synchronization drops Decoder: * avcodec: revector video decoder to fix incomplete drain diff --git a/modules/packetizer/flac.c b/modules/packetizer/flac.c index 40251041c3..8e98ecc690 100644 --- a/modules/packetizer/flac.c +++ b/modules/packetizer/flac.c @@ -394,17 +394,35 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) if(block_FindStartcodeFromOffset(&p_sys->bytestream, &p_sys->i_offset, NULL, 2, FLACStartcodeHelper, - FLACStartcodeMatcher) == VLC_SUCCESS) + FLACStartcodeMatcher) != VLC_SUCCESS) { - p_sys->i_state = STATE_GET_DATA; - break; + if( pp_block == NULL ) /* EOF/Drain */ + { + p_sys->i_offset = block_BytestreamRemaining( &p_sys->bytestream ); + p_sys->i_state = STATE_GET_DATA; + continue; + } + return NULL; } - else if( pp_block == NULL ) + + /* Check next header */ + uint8_t nextheader[FLAC_HEADER_SIZE_MAX]; + if (block_PeekOffsetBytes(&p_sys->bytestream, p_sys->i_offset, + nextheader, FLAC_HEADER_SIZE_MAX)) + return NULL; /* Need more data */ + + struct flac_header_info dummy; + /* Check if frame is valid and get frame info */ + if(FLAC_ParseSyncInfo(nextheader, + p_sys->b_stream_info ? &p_sys->stream_info : NULL, + NULL, &dummy) == 0) { - p_sys->i_offset = block_BytestreamRemaining( &p_sys->bytestream ); - p_sys->i_state = STATE_GET_DATA; + p_sys->i_offset++; + continue; } - return NULL; + + p_sys->i_state = STATE_GET_DATA; + continue; } case STATE_GET_DATA: @@ -478,6 +496,11 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) p_sys->i_last_frame_size = p_sys->i_frame_size; p_sys->i_offset = 0; p_sys->crc = 0; + + if( block_BytestreamRemaining(&p_sys->bytestream) > 0 ) + p_sys->i_state = STATE_SEND_DATA; + else + p_sys->i_state = STATE_NOSYNC; } break; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
