[vlc-commits] [Git][videolan/vlc][3.0.x] demux: mp4: fix MP4_EIA608_Convert parsing
François Cartegnie (@fcartegnie)
gitlab at videolan.org
Sun Sep 13 17:05:18 UTC 2026
François Cartegnie pushed to branch 3.0.x at VideoLAN / VLC
Commits:
a1d96651 by François Cartegnie at 2026-09-13T18:55:52+02:00
demux: mp4: fix MP4_EIA608_Convert parsing
fix #29884
Reported-by: oxsignal awo at kakao.com
(adapted from commit 36c1a58b61cd845a5adb5688042cfb4d7d3102b5)
(adapted from commit d7137c09dc728d9f2460eceac440c30bbaf3714e)
- - - - -
1 changed file:
- modules/demux/mp4/mp4.c
Changes:
=====================================
modules/demux/mp4/mp4.c
=====================================
@@ -536,61 +536,62 @@ static int CreateTracks( demux_t *p_demux, unsigned i_tracks )
static block_t * MP4_EIA608_Convert( block_t * p_block )
{
/* Rebuild codec data from encap */
- size_t i_copied = 0;
- size_t i_remaining = __MIN(p_block->i_buffer, INT64_MAX / 3);
- uint32_t i_bytes = 0;
- block_t *p_newblock;
+ block_t *p_newblock = NULL;
- /* always need at least 10 bytes (atom size+header+1pair)*/
- i_bytes = GetDWBE(p_block->p_buffer);
+ assert(p_block->i_buffer <= SSIZE_MAX);
- if (10 < i_bytes || i_bytes < i_remaining ||
- memcmp("cdat", &p_block->p_buffer[4], 4) ||
- (p_newblock = block_Alloc(i_remaining * 3 - 8)) == NULL)
- {
- p_block->i_buffer = 0;
- return p_block;
- }
+ if (p_block->i_buffer < 8)
+ goto out;
- uint8_t *p_write = p_newblock->p_buffer;
- uint8_t *p_read = &p_block->p_buffer[8];
- i_bytes -= 8;
- i_remaining -= 8;
+ uint_fast32_t atomsize = GetDWBE(p_block->p_buffer);
+ if (atomsize < 8 || atomsize > p_block->i_buffer ||
+ memcmp(&p_block->p_buffer[4], "cdat", 4))
+ goto out;
- do
- {
- p_write[i_copied++] = CC_PKT_BYTE0(0); /* cc1 == field 0 */
- p_write[i_copied++] = p_read[0];
- p_write[i_copied++] = p_read[1];
- p_read += 2;
- i_bytes -= 2;
- i_remaining -= 2;
- } while( i_bytes >= 2 );
+ const uint8_t *cdat = p_block->p_buffer + 8;
+ uint_fast32_t cdat_size = (atomsize - 8) & ~1;
+
+ p_block->p_buffer += atomsize;
+ p_block->i_buffer -= atomsize;
/* cdt2 is optional */
- i_bytes = GetDWBE(p_read);
+ uint_fast32_t cdt2_size = 0;
+ const uint8_t *cdt2 = NULL;
- if (10 <= i_bytes && i_bytes <= i_remaining &&
- !memcmp("cdt2", &p_read[4], 4))
- {
- p_read += 8;
- i_bytes -= 8;
- i_remaining -= 8;
- do
- {
- p_write[i_copied++] = CC_PKT_BYTE0(1); /* cc2 == field 1 */
- p_write[i_copied++] = p_read[0];
- p_write[i_copied++] = p_read[1];
- p_read += 2;
- i_bytes -= 2;
- } while( i_bytes >= 2 );
+ if (p_block->i_buffer >= 8) {
+ atomsize = GetDWBE(p_block->p_buffer);
+
+ if (atomsize > 8 && atomsize <= p_block->i_buffer &&
+ !memcmp(&p_block->p_buffer[4], "cdt2", 4)) {
+ cdt2 = p_block->p_buffer + 8;
+ cdt2_size = (atomsize - 8) & ~1;
+ }
+ }
+
+ p_newblock = block_Alloc((cdat_size + cdt2_size) / 2 * 3);
+ if (unlikely(p_newblock == NULL))
+ goto out;
+
+ uint8_t *out = p_newblock->p_buffer;
+
+ while (cdat_size >= 2) {
+ *(out++) = CC_PKT_BYTE0(0); /* cc1 == field 0 */
+ *(out++) = *(cdat++);
+ *(out++) = *(cdat++);
+ cdat_size -= 2;
+ }
+
+ while (cdt2_size >= 2) {
+ *(out++) = CC_PKT_BYTE0(1); /* cc2 == field 1 */
+ *(out++) = *(cdt2++);
+ *(out++) = *(cdt2++);
+ cdt2_size -= 2;
}
p_newblock->i_pts = p_block->i_dts;
- p_newblock->i_buffer = i_copied;
p_newblock->i_flags = BLOCK_FLAG_TYPE_P;
+out:
block_Release( p_block );
-
return p_newblock;
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/a1d9665126823dd0b7dd775219942d11d97c474c
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/a1d9665126823dd0b7dd775219942d11d97c474c
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help
More information about the vlc-commits
mailing list