Merge branch 'mr080803' into 'master'

decoders: update palette per frame

See merge request videolan/vlc!4063
This commit is contained in:
François Cartegnie 2024-04-28 07:10:47 +00:00
commit 447d1b54c5
2 changed files with 11 additions and 11 deletions

View File

@ -1439,21 +1439,17 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( p_context->pix_fmt == AV_PIX_FMT_PAL8
&& !p_dec->fmt_out.video.p_palette )
{
/* See AV_PIX_FMT_PAL8 comment in avc_GetVideoFormat(): update the
* fmt_out palette and change the fmt_out chroma to request a new
* vout */
assert( p_dec->fmt_out.video.i_chroma != VLC_CODEC_RGBP );
video_palette_t *p_palette;
p_palette = p_dec->fmt_out.video.p_palette
= malloc( sizeof(video_palette_t) );
if( !p_palette )
p_dec->fmt_out.video.p_palette = malloc( sizeof(video_palette_t) );
if( !p_dec->fmt_out.video.p_palette )
{
vlc_mutex_unlock(&p_sys->lock);
b_error = true;
av_frame_free(&frame);
break;
}
video_palette_t *p_palette = p_dec->fmt_out.video.p_palette;
static_assert( sizeof(p_palette->palette) == AVPALETTE_SIZE,
"Palette size mismatch between vlc and libavutil" );
assert( frame->data[1] != NULL );
@ -1510,6 +1506,9 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block )
}
}
if( p_context->pix_fmt == AV_PIX_FMT_PAL8 && p_pic->format.p_palette )
lavc_Frame8PaletteCopy( p_pic->format.p_palette, frame->data[1] );
if( !p_dec->fmt_in->video.i_sar_num || !p_dec->fmt_in->video.i_sar_den )
{
/* Fetch again the aspect ratio in case it changed */

View File

@ -619,9 +619,9 @@ static void Convert( filter_t *p_filter, struct SwsContext *ctx,
p_src, i_plane_count, b_swap_uvi );
if( p_filter->fmt_in.video.i_chroma == VLC_CODEC_RGBP )
{
if( p_filter->fmt_in.video.p_palette )
const video_palette_t *p_palette = p_src->format.p_palette;
if( p_palette )
{
const video_palette_t *p_palette = p_filter->fmt_in.video.p_palette;
static_assert(sizeof(p_palette->palette) == AVPALETTE_SIZE,
"Palette size mismatch between vlc and libavutil");
uint8_t *dstp = palette;
@ -644,6 +644,7 @@ static void Convert( filter_t *p_filter, struct SwsContext *ctx,
}
else
{
assert(p_palette);
memset( &palette, 0, sizeof(palette) );
}
src[1] = palette;