Commit ae1c750c authored by Matthieu Bouron's avatar Matthieu Bouron

lavc/utils: use AVPixFmtDescriptor to probe palette formats

Also use the input frame format instead of the AVCodecContext one according
to the documentation of AVCodecContext.get_buffer2().
parent 0c59d40a
...@@ -646,6 +646,7 @@ fail: ...@@ -646,6 +646,7 @@ fail:
static int video_get_buffer(AVCodecContext *s, AVFrame *pic) static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
{ {
FramePool *pool = s->internal->pool; FramePool *pool = s->internal->pool;
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format);
int i; int i;
if (pic->data[0]) { if (pic->data[0]) {
...@@ -653,6 +654,13 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic) ...@@ -653,6 +654,13 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
return -1; return -1;
} }
if (!desc) {
av_log(s, AV_LOG_ERROR,
"Unable to get pixel format descriptor for format %s\n",
av_get_pix_fmt_name(pic->format));
return AVERROR(EINVAL);
}
memset(pic->data, 0, sizeof(pic->data)); memset(pic->data, 0, sizeof(pic->data));
pic->extended_data = pic->data; pic->extended_data = pic->data;
...@@ -669,8 +677,9 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic) ...@@ -669,8 +677,9 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
pic->data[i] = NULL; pic->data[i] = NULL;
pic->linesize[i] = 0; pic->linesize[i] = 0;
} }
if (pic->data[1] && !pic->data[2]) if (desc->flags & AV_PIX_FMT_FLAG_PAL ||
avpriv_set_systematic_pal2((uint32_t *)pic->data[1], s->pix_fmt); desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)
avpriv_set_systematic_pal2((uint32_t *)pic->data[1], pic->format);
if (s->debug & FF_DEBUG_BUFFERS) if (s->debug & FF_DEBUG_BUFFERS)
av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p\n", pic); av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p\n", pic);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment