You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
Merge commit '8e373fe048812a25b238ea60a7052b8c07639a42'
* commit '8e373fe048812a25b238ea60a7052b8c07639a42': hevc: Factor out the pixel format mapping from the sps parser Conflicts: libavcodec/hevc_ps.c Merged-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
@@ -742,10 +742,56 @@ static int scaling_list_data(GetBitContext *gb, AVCodecContext *avctx, ScalingLi
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int map_pixel_format(AVCodecContext *avctx, HEVCSPS *sps)
|
||||||
|
{
|
||||||
|
const AVPixFmtDescriptor *desc;
|
||||||
|
switch (sps->bit_depth) {
|
||||||
|
case 8:
|
||||||
|
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY8;
|
||||||
|
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
|
||||||
|
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
|
||||||
|
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
||||||
|
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P9;
|
||||||
|
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P9;
|
||||||
|
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P9;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
||||||
|
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
|
||||||
|
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
|
||||||
|
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
||||||
|
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
|
||||||
|
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
|
||||||
|
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"4:2:0, 4:2:2, 4:4:4 supports are currently specified for 8, 10 and 12 bits.\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = av_pix_fmt_desc_get(sps->pix_fmt);
|
||||||
|
if (!desc)
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
|
sps->hshift[0] = sps->vshift[0] = 0;
|
||||||
|
sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
|
||||||
|
sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
|
||||||
|
|
||||||
|
sps->pixel_shift = sps->bit_depth > 8;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
|
int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
|
||||||
int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx)
|
int apply_defdispwin, AVBufferRef **vps_list, AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
const AVPixFmtDescriptor *desc;
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int log2_diff_max_min_transform_block_size;
|
int log2_diff_max_min_transform_block_size;
|
||||||
int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
|
int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
|
||||||
@@ -831,47 +877,9 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sps->bit_depth) {
|
ret = map_pixel_format(avctx, sps);
|
||||||
case 8:
|
if (ret < 0)
|
||||||
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY8;
|
return ret;
|
||||||
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
|
|
||||||
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
|
|
||||||
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
|
||||||
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P9;
|
|
||||||
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P9;
|
|
||||||
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P9;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
|
||||||
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
|
|
||||||
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
|
|
||||||
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
if (sps->chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY16;
|
|
||||||
if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
|
|
||||||
if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
|
|
||||||
if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
av_log(avctx, AV_LOG_ERROR,
|
|
||||||
"4:2:0, 4:2:2, 4:4:4 supports are currently specified for 8, 10 and 12 bits.\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
desc = av_pix_fmt_desc_get(sps->pix_fmt);
|
|
||||||
if (!desc) {
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sps->hshift[0] = sps->vshift[0] = 0;
|
|
||||||
sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
|
|
||||||
sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
|
|
||||||
|
|
||||||
sps->pixel_shift = sps->bit_depth > 8;
|
|
||||||
|
|
||||||
sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4;
|
sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4;
|
||||||
if (sps->log2_max_poc_lsb > 16) {
|
if (sps->log2_max_poc_lsb > 16) {
|
||||||
|
Reference in New Issue
Block a user