mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-05-29 21:47:48 +02:00
lavc/vaapi_decode: add profile_parser and format map support for HEVC REXT
Add function pointer field in vaapi_profile_map[], set profile_parser for HEVC_REXT to find the exact va_profile. Also add format map support. Signed-off-by: Linjie Fu <linjie.fu@intel.com>
This commit is contained in:
parent
85cc7bcd4c
commit
d2378645fb
@ -24,6 +24,7 @@
|
|||||||
#include "decode.h"
|
#include "decode.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "vaapi_decode.h"
|
#include "vaapi_decode.h"
|
||||||
|
#include "vaapi_hevc.h"
|
||||||
|
|
||||||
|
|
||||||
int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
|
int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
|
||||||
@ -255,6 +256,10 @@ static const struct {
|
|||||||
MAP(422H, YUV422P),
|
MAP(422H, YUV422P),
|
||||||
#ifdef VA_FOURCC_YV16
|
#ifdef VA_FOURCC_YV16
|
||||||
MAP(YV16, YUV422P),
|
MAP(YV16, YUV422P),
|
||||||
|
#endif
|
||||||
|
MAP(YUY2, YUYV422),
|
||||||
|
#ifdef VA_FOURCC_Y210
|
||||||
|
MAP(Y210, Y210),
|
||||||
#endif
|
#endif
|
||||||
// 4:4:0
|
// 4:4:0
|
||||||
MAP(422V, YUV440P),
|
MAP(422V, YUV440P),
|
||||||
@ -364,8 +369,9 @@ static const struct {
|
|||||||
enum AVCodecID codec_id;
|
enum AVCodecID codec_id;
|
||||||
int codec_profile;
|
int codec_profile;
|
||||||
VAProfile va_profile;
|
VAProfile va_profile;
|
||||||
|
VAProfile (*profile_parser)(AVCodecContext *avctx);
|
||||||
} vaapi_profile_map[] = {
|
} vaapi_profile_map[] = {
|
||||||
#define MAP(c, p, v) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v }
|
#define MAP(c, p, v, ...) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v, __VA_ARGS__ }
|
||||||
MAP(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2Simple ),
|
MAP(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2Simple ),
|
||||||
MAP(MPEG2VIDEO, MPEG2_MAIN, MPEG2Main ),
|
MAP(MPEG2VIDEO, MPEG2_MAIN, MPEG2Main ),
|
||||||
MAP(H263, UNKNOWN, H263Baseline),
|
MAP(H263, UNKNOWN, H263Baseline),
|
||||||
@ -380,6 +386,10 @@ static const struct {
|
|||||||
#if VA_CHECK_VERSION(0, 37, 0)
|
#if VA_CHECK_VERSION(0, 37, 0)
|
||||||
MAP(HEVC, HEVC_MAIN, HEVCMain ),
|
MAP(HEVC, HEVC_MAIN, HEVCMain ),
|
||||||
MAP(HEVC, HEVC_MAIN_10, HEVCMain10 ),
|
MAP(HEVC, HEVC_MAIN_10, HEVCMain10 ),
|
||||||
|
#endif
|
||||||
|
#if VA_CHECK_VERSION(1, 2, 0)
|
||||||
|
MAP(HEVC, HEVC_REXT, None,
|
||||||
|
ff_vaapi_parse_hevc_rext_profile ),
|
||||||
#endif
|
#endif
|
||||||
MAP(MJPEG, MJPEG_HUFFMAN_BASELINE_DCT,
|
MAP(MJPEG, MJPEG_HUFFMAN_BASELINE_DCT,
|
||||||
JPEGBaseline),
|
JPEGBaseline),
|
||||||
@ -415,8 +425,8 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
|
|||||||
VAStatus vas;
|
VAStatus vas;
|
||||||
int err, i, j;
|
int err, i, j;
|
||||||
const AVCodecDescriptor *codec_desc;
|
const AVCodecDescriptor *codec_desc;
|
||||||
VAProfile *profile_list = NULL, matched_va_profile;
|
VAProfile *profile_list = NULL, matched_va_profile, va_profile;
|
||||||
int profile_count, exact_match, matched_ff_profile;
|
int profile_count, exact_match, matched_ff_profile, codec_profile;
|
||||||
|
|
||||||
AVHWDeviceContext *device = (AVHWDeviceContext*)device_ref->data;
|
AVHWDeviceContext *device = (AVHWDeviceContext*)device_ref->data;
|
||||||
AVVAAPIDeviceContext *hwctx = device->hwctx;
|
AVVAAPIDeviceContext *hwctx = device->hwctx;
|
||||||
@ -454,15 +464,21 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
|
|||||||
if (avctx->profile == vaapi_profile_map[i].codec_profile ||
|
if (avctx->profile == vaapi_profile_map[i].codec_profile ||
|
||||||
vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN)
|
vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN)
|
||||||
profile_match = 1;
|
profile_match = 1;
|
||||||
|
|
||||||
|
va_profile = vaapi_profile_map[i].profile_parser ?
|
||||||
|
vaapi_profile_map[i].profile_parser(avctx) :
|
||||||
|
vaapi_profile_map[i].va_profile;
|
||||||
|
codec_profile = vaapi_profile_map[i].codec_profile;
|
||||||
|
|
||||||
for (j = 0; j < profile_count; j++) {
|
for (j = 0; j < profile_count; j++) {
|
||||||
if (vaapi_profile_map[i].va_profile == profile_list[j]) {
|
if (va_profile == profile_list[j]) {
|
||||||
exact_match = profile_match;
|
exact_match = profile_match;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (j < profile_count) {
|
if (j < profile_count) {
|
||||||
matched_va_profile = vaapi_profile_map[i].va_profile;
|
matched_va_profile = va_profile;
|
||||||
matched_ff_profile = vaapi_profile_map[i].codec_profile;
|
matched_ff_profile = codec_profile;
|
||||||
if (exact_match)
|
if (exact_match)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user