git » vlc.git » commit 5821369

Fix FLAC playback (FS#77990)

author Antonio Rojas
2023-03-25 10:30:40 UTC
committer Antonio Rojas
2023-03-25 10:30:40 UTC
parent f5aeeea261d4bdd2328be3e1dbe7256f8673fdf2

Fix FLAC playback (FS#77990)

PKGBUILD +5 -3
c2dd4bfe.patch +92 -0

diff --git a/PKGBUILD b/PKGBUILD
index d0dc62e..4982521 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -8,7 +8,7 @@ _vlcver=3.0.18
 # optional fixup version including hyphen
 _vlcfixupver=
 pkgver=${_vlcver}${_vlcfixupver//-/.r}
-pkgrel=7
+pkgrel=8
 pkgdesc='Multi-platform MPEG, VCD/DVD, and DivX player'
 url='https://www.videolan.org/vlc/'
 arch=('x86_64')
@@ -103,11 +103,13 @@ replaces=('vlc-plugin')
 options=('!emptydirs')
 source=(https://download.videolan.org/${pkgname}/${_vlcver}/${pkgname}-${_vlcver}${_vlcfixupver}.tar.xz{,.asc}
         libplacebo-5.patch
-        update-vlc-plugin-cache.hook)
+        update-vlc-plugin-cache.hook
+        c2dd4bfe.patch)
 sha512sums=('6fc8fdaa7e8862ad7133d69b3dab99ab9cd3945846a6ce5e2379b7f68ee9accd385c53b8573fc7c82f732c24678b4932b1154d2ad8accf06305f2f578d6fcd8e'
             'SKIP'
             'a06b04a8b059dbbef77d27435bd5bec3c26f937390bd112b0843385587e866e617c3dd0e66f99eed5fa4a91bc5f0fd9b5623f65b2f2435a54456dde2aa96209b'
-            'b247510ffeadfd439a5dadd170c91900b6cdb05b5ca00d38b1a17c720ffe5a9f75a32e0cb1af5ebefdf1c23c5acc53513ed983a736e8fa30dd8fad237ef49dd3')
+            'b247510ffeadfd439a5dadd170c91900b6cdb05b5ca00d38b1a17c720ffe5a9f75a32e0cb1af5ebefdf1c23c5acc53513ed983a736e8fa30dd8fad237ef49dd3'
+            '10801260f94c38b57d1c5666dc1772296537dbfd11d132e46fce98c3b185d9c3861a0b4e9076091990bf035525ed4f67376d4766eae63059f025c76251b6379b')
 validpgpkeys=('65F7C6B4206BD057A7EB73787180713BE58D1ADC') # VideoLAN Release Signing Key
 
 prepare() {
diff --git a/c2dd4bfe.patch b/c2dd4bfe.patch
new file mode 100644
index 0000000..bdd5921
--- /dev/null
+++ b/c2dd4bfe.patch
@@ -0,0 +1,92 @@
+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
+