Skip to content

Commit f3aefb3

Browse files
LongChairfhvwy
authored andcommitted
lavc: Add support for RockChip Media Process Platform
This adds hardware decoding for H.264 / HEVC / VP8 / VP9 using the MPP Rockchip API. It returns frames holding an AVDRMFrameDescriptor struct in buf[0] that allows drm / dmabuf usage. Tested on RK3288 (TinkerBoard) and RK3328. Signed-off-by: Mark Thompson <sw@jkqxz.net>
1 parent d125675 commit f3aefb3

File tree

6 files changed

+621
-1
lines changed

6 files changed

+621
-1
lines changed

Changelog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ version <next>:
5050
- KMS screen grabber
5151
- CUDA thumbnail filter
5252
- V4L2 mem2mem HW assisted codecs
53+
- Rockchip MPP hardware decoding
5354

5455

5556
version 3.3:

configure

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ External library support:
316316
--disable-nvenc disable Nvidia video encoding code [autodetect]
317317
--enable-omx enable OpenMAX IL code [no]
318318
--enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no]
319+
--enable-rkmpp enable Rockchip Media Process Platform code [no]
319320
--disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect]
320321
--disable-vda disable Apple Video Decode Acceleration code [autodetect]
321322
--disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
@@ -1567,6 +1568,7 @@ EXTERNAL_LIBRARY_VERSION3_LIST="
15671568
libopencore_amrnb
15681569
libopencore_amrwb
15691570
libvo_amrwbenc
1571+
rkmpp
15701572
"
15711573

15721574
EXTERNAL_LIBRARY_GPLV3_LIST="
@@ -2801,6 +2803,8 @@ h264_qsv_decoder_deps="libmfx"
28012803
h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec h264_qsv_hwaccel"
28022804
h264_qsv_encoder_deps="libmfx"
28032805
h264_qsv_encoder_select="qsvenc"
2806+
h264_rkmpp_decoder_deps="rkmpp"
2807+
h264_rkmpp_decoder_select="h264_mp4toannexb_bsf"
28042808
h264_vaapi_encoder_deps="VAEncPictureParameterBufferH264"
28052809
h264_vaapi_encoder_select="vaapi_encode golomb"
28062810
h264_vda_decoder_deps="vda"
@@ -2818,6 +2822,8 @@ hevc_qsv_decoder_deps="libmfx"
28182822
hevc_qsv_decoder_select="hevc_mp4toannexb_bsf hevc_parser qsvdec hevc_qsv_hwaccel"
28192823
hevc_qsv_encoder_deps="libmfx"
28202824
hevc_qsv_encoder_select="hevcparse qsvenc"
2825+
hevc_rkmpp_decoder_deps="rkmpp"
2826+
hevc_rkmpp_decoder_select="hevc_mp4toannexb_bsf"
28212827
hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC"
28222828
hevc_vaapi_encoder_select="vaapi_encode golomb"
28232829
hevc_v4l2m2m_decoder_deps="v4l2_m2m hevc_v4l2_m2m"
@@ -2864,12 +2870,14 @@ vp8_cuvid_decoder_deps="cuda cuvid"
28642870
vp8_mediacodec_decoder_deps="mediacodec"
28652871
vp8_qsv_decoder_deps="libmfx"
28662872
vp8_qsv_decoder_select="qsvdec vp8_qsv_hwaccel vp8_parser"
2873+
vp8_rkmpp_decoder_deps="rkmpp"
28672874
vp8_vaapi_encoder_deps="VAEncPictureParameterBufferVP8"
28682875
vp8_vaapi_encoder_select="vaapi_encode"
28692876
vp8_v4l2m2m_decoder_deps="v4l2_m2m vp8_v4l2_m2m"
28702877
vp8_v4l2m2m_encoder_deps="v4l2_m2m vp8_v4l2_m2m"
28712878
vp9_cuvid_decoder_deps="cuda cuvid"
28722879
vp9_mediacodec_decoder_deps="mediacodec"
2880+
vp9_rkmpp_decoder_deps="rkmpp"
28732881
vp9_vaapi_encoder_deps="VAEncPictureParameterBufferVP9"
28742882
vp9_vaapi_encoder_select="vaapi_encode"
28752883
vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
@@ -6066,6 +6074,13 @@ enabled openssl && { use_pkg_config "" openssl openssl/ssl.h OPENSSL_i
60666074
check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
60676075
check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
60686076
die "ERROR: openssl not found"; }
6077+
enabled rkmpp && { { require_pkg_config rockchip_mpp rockchip_mpp rockchip/rk_mpi.h mpp_create ||
6078+
die "ERROR : Rockchip MPP was not found."; } &&
6079+
{ check_func_headers rockchip/rk_mpi_cmd.h "MPP_DEC_GET_FREE_PACKET_SLOT_COUNT" ||
6080+
die "ERROR: Rockchip MPP is outdated, please get a more recent one."; } &&
6081+
{ enabled libdrm ||
6082+
die "ERROR: rkmpp requires --enable-libdrm"; }
6083+
}
60696084

60706085
if enabled gcrypt; then
60716086
GCRYPT_CONFIG="${cross_prefix}libgcrypt-config"

libavcodec/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ OBJS-$(CONFIG_H264_VDA_DECODER) += vda_h264_dec.o
341341
OBJS-$(CONFIG_H264_OMX_ENCODER) += omx.o
342342
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h2645.o
343343
OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
344+
OBJS-$(CONFIG_H264_RKMPP_DECODER) += rkmppdec.o
344345
OBJS-$(CONFIG_H264_VAAPI_ENCODER) += vaapi_encode_h264.o vaapi_encode_h26x.o
345346
OBJS-$(CONFIG_H264_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o
346347
OBJS-$(CONFIG_H264_V4L2M2M_DECODER) += v4l2_m2m_dec.o
@@ -357,6 +358,7 @@ OBJS-$(CONFIG_NVENC_HEVC_ENCODER) += nvenc_hevc.o
357358
OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec_h2645.o
358359
OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \
359360
hevc_data.o
361+
OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o
360362
OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o vaapi_encode_h26x.o
361363
OBJS-$(CONFIG_HEVC_V4L2M2M_DECODER) += v4l2_m2m_dec.o
362364
OBJS-$(CONFIG_HEVC_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
@@ -636,6 +638,7 @@ OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o
636638
OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuvid.o
637639
OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o
638640
OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec_other.o
641+
OBJS-$(CONFIG_VP8_RKMPP_DECODER) += rkmppdec.o
639642
OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o
640643
OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o
641644
OBJS-$(CONFIG_VP8_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
@@ -644,6 +647,7 @@ OBJS-$(CONFIG_VP9_DECODER) += vp9.o vp9data.o vp9dsp.o vp9lpf.o vp9r
644647
vp9dsp_8bpp.o vp9dsp_10bpp.o vp9dsp_12bpp.o
645648
OBJS-$(CONFIG_VP9_CUVID_DECODER) += cuvid.o
646649
OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec.o
650+
OBJS-$(CONFIG_VP9_RKMPP_DECODER) += rkmppdec.o
647651
OBJS-$(CONFIG_VP9_VAAPI_ENCODER) += vaapi_encode_vp9.o
648652
OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o
649653
OBJS-$(CONFIG_VP9_V4L2M2M_DECODER) += v4l2_m2m_dec.o

libavcodec/allcodecs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,15 @@ static void register_all(void)
215215
REGISTER_DECODER(H264_MEDIACODEC, h264_mediacodec);
216216
REGISTER_DECODER(H264_MMAL, h264_mmal);
217217
REGISTER_DECODER(H264_QSV, h264_qsv);
218+
REGISTER_DECODER(H264_RKMPP, h264_rkmpp);
218219
REGISTER_DECODER(H264_VDA, h264_vda);
219220
#if FF_API_VDPAU
220221
REGISTER_DECODER(H264_VDPAU, h264_vdpau);
221222
#endif
222223
REGISTER_ENCDEC (HAP, hap);
223224
REGISTER_DECODER(HEVC, hevc);
224225
REGISTER_DECODER(HEVC_QSV, hevc_qsv);
226+
REGISTER_DECODER(HEVC_RKMPP, hevc_rkmpp);
225227
REGISTER_ENCDEC (HEVC_V4L2M2M, hevc_v4l2m2m);
226228
REGISTER_DECODER(HNM4_VIDEO, hnm4_video);
227229
REGISTER_DECODER(HQ_HQA, hq_hqa);
@@ -380,8 +382,10 @@ static void register_all(void)
380382
REGISTER_DECODER(VP6F, vp6f);
381383
REGISTER_DECODER(VP7, vp7);
382384
REGISTER_DECODER(VP8, vp8);
385+
REGISTER_DECODER(VP8_RKMPP, vp8_rkmpp);
383386
REGISTER_ENCDEC (VP8_V4L2M2M, vp8_v4l2m2m);
384387
REGISTER_DECODER(VP9, vp9);
388+
REGISTER_DECODER(VP9_RKMPP, vp9_rkmpp);
385389
REGISTER_DECODER(VP9_V4L2M2M, vp9_v4l2m2m);
386390
REGISTER_DECODER(VQA, vqa);
387391
REGISTER_DECODER(BITPACKED, bitpacked);

0 commit comments

Comments
 (0)