mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-18 22:54:00 +00:00
92 lines
3.9 KiB
Diff
92 lines
3.9 KiB
Diff
From c2dd4bfefe079e49db1789eb76be3885e4fc31b4 Mon Sep 17 00:00:00 2001
|
|
From: Francois Cartegnie <fcvlcdev@free.fr>
|
|
Date: Mon, 7 Nov 2022 15:02:57 +0100
|
|
Subject: [PATCH] packetizer: flac: fix CRC from emulated sync
|
|
|
|
also skips some memcpy
|
|
|
|
refs #27454 #27477
|
|
|
|
(cherry picked from commit c14b5aa6a7bd3aa25fa951e2b4136aff70f5702a)
|
|
---
|
|
modules/packetizer/flac.c | 13 +++++++++++--
|
|
1 file changed, 11 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/modules/packetizer/flac.c b/modules/packetizer/flac.c
|
|
index 8998f5dac0f..bfb504f004e 100644
|
|
--- a/modules/packetizer/flac.c
|
|
+++ b/modules/packetizer/flac.c
|
|
@@ -78,6 +78,7 @@ struct decoder_sys_t
|
|
|
|
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;
|
|
|
|
@@ -386,6 +387,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
|
|
@@ -461,6 +463,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;
|
|
@@ -484,10 +487,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]);
|
|
@@ -497,6 +502,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 */
|
|
@@ -513,6 +519,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;
|
|
@@ -553,6 +560,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;
|
|
@@ -587,6 +595,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_TS_INVALID;
|
|
+ p_sys->i_buf_offset = 0;
|
|
p_sys->i_buf = 0;
|
|
p_sys->p_buf = NULL;
|
|
p_sys->i_next_block_flags = 0;
|
|
--
|
|
GitLab
|
|
|