mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-31 14:37:59 +00:00
Merge pull request #4166 from lrusak/ffmpeg-update
ffmpeg: update to 4.2.2-Matrix-Alpha1
This commit is contained in:
commit
dea2d7a082
@ -3,9 +3,9 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="ffmpeg"
|
||||
# Current branch is: release/4.0-kodi
|
||||
PKG_VERSION="4.0.4-Leia-18.4"
|
||||
PKG_SHA256="e11e7594af35f36ab2711252c3d6bb106908f26605498aef4a9be2d7bc001db2"
|
||||
# Current branch is: release/4.2-kodi
|
||||
PKG_VERSION="4.2.2-Matrix-Alpha1"
|
||||
PKG_SHA256="0dba571f9809588cfbdc29d6a551dab4cd5736701653d9263847c9ac67bcde86"
|
||||
PKG_LICENSE="LGPLv2.1+"
|
||||
PKG_SITE="https://ffmpeg.org"
|
||||
PKG_URL="https://github.com/xbmc/FFmpeg/archive/${PKG_VERSION}.tar.gz"
|
||||
|
@ -1,26 +1,18 @@
|
||||
From 7adc8f706efab65d8d7e5f960690faca3d5c190d Mon Sep 17 00:00:00 2001
|
||||
From 85417a4ba42360248b4999e458a6e05c1c2f9b17 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Sat, 4 Mar 2017 19:24:02 +0000
|
||||
Subject: [PATCH] ffmpeg: Call get_format to fix an issue with MMAL rendering
|
||||
|
||||
---
|
||||
libavcodec/dvdec.c | 7 +++++++
|
||||
libavcodec/dvdec.c | 6 ++++++
|
||||
libavcodec/rv34.c | 6 +++++-
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c
|
||||
index 0b4c1bc..00081ef 100644
|
||||
index 89864f2edc..b5f9224d72 100644
|
||||
--- a/libavcodec/dvdec.c
|
||||
+++ b/libavcodec/dvdec.c
|
||||
@@ -49,6 +49,7 @@
|
||||
#include "internal.h"
|
||||
#include "put_bits.h"
|
||||
#include "simple_idct.h"
|
||||
+#include "thread.h"
|
||||
|
||||
typedef struct BlockInfo {
|
||||
const uint32_t *factor_table;
|
||||
@@ -196,6 +197,12 @@ static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
|
||||
@@ -197,6 +197,12 @@ static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
|
||||
s->idct_put[0] = idsp.idct_put;
|
||||
s->idct_put[1] = ff_simple_idct248_put;
|
||||
|
||||
@ -34,10 +26,10 @@ index 0b4c1bc..00081ef 100644
|
||||
}
|
||||
|
||||
diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
|
||||
index aca8382..f473f6c 100644
|
||||
index d171e6e1bd..f6f0aa1f74 100644
|
||||
--- a/libavcodec/rv34.c
|
||||
+++ b/libavcodec/rv34.c
|
||||
@@ -1493,7 +1493,11 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
|
||||
@@ -1499,7 +1499,11 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
|
||||
ff_mpv_decode_init(s, avctx);
|
||||
s->out_format = FMT_H263;
|
||||
|
||||
@ -51,5 +43,5 @@ index aca8382..f473f6c 100644
|
||||
s->low_delay = 0;
|
||||
|
||||
--
|
||||
2.7.4
|
||||
2.20.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From d8bdcc8791c501921ee8961f3b0de0bd47668ebf Mon Sep 17 00:00:00 2001
|
||||
From 848de6c1923820f1de49ed7875d6c8877d0c321c Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Fri, 5 Jun 2015 22:48:33 +0100
|
||||
Subject: [PATCH] mpeg4video: Signal unsupported GMC with more than one warp
|
||||
@ -10,10 +10,10 @@ Subject: [PATCH] mpeg4video: Signal unsupported GMC with more than one warp
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
|
||||
index c26b6d607c..6c4b011b5c 100644
|
||||
index a36b675fba..880284d5bd 100644
|
||||
--- a/libavcodec/avcodec.h
|
||||
+++ b/libavcodec/avcodec.h
|
||||
@@ -2965,6 +2965,7 @@ typedef struct AVCodecContext {
|
||||
@@ -2612,6 +2612,7 @@ typedef struct AVCodecContext {
|
||||
#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
|
||||
#define FF_BUG_TRUNCATED 16384
|
||||
#define FF_BUG_IEDGE 32768
|
||||
@ -22,10 +22,10 @@ index c26b6d607c..6c4b011b5c 100644
|
||||
/**
|
||||
* strictly follow the standard (MPEG-4, ...).
|
||||
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
|
||||
index cd39131d55..d8c8227cb4 100644
|
||||
index 055afabc7e..fa208660c8 100644
|
||||
--- a/libavcodec/mpeg4videodec.c
|
||||
+++ b/libavcodec/mpeg4videodec.c
|
||||
@@ -2250,6 +2250,9 @@ int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
|
||||
@@ -2662,6 +2662,9 @@ int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
|
||||
|
||||
if (ctx->divx_version >= 0)
|
||||
s->workaround_bugs |= FF_BUG_HPEL_CHROMA;
|
||||
@ -35,7 +35,7 @@ index cd39131d55..d8c8227cb4 100644
|
||||
}
|
||||
|
||||
if (s->workaround_bugs & FF_BUG_STD_QPEL) {
|
||||
@@ -2274,6 +2277,7 @@ int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
|
||||
@@ -2686,6 +2689,7 @@ int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
|
||||
s->workaround_bugs, ctx->lavc_build, ctx->xvid_build,
|
||||
ctx->divx_version, ctx->divx_build, s->divx_packed ? "p" : "");
|
||||
|
||||
@ -44,5 +44,5 @@ index cd39131d55..d8c8227cb4 100644
|
||||
s->codec_id == AV_CODEC_ID_MPEG4 &&
|
||||
avctx->idct_algo == FF_IDCT_AUTO) {
|
||||
--
|
||||
2.14.1
|
||||
2.20.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 20af7af23a9f366476e67669f14957dfaf58f141 Mon Sep 17 00:00:00 2001
|
||||
From a853a9c70339c30ea4d5081366fee4bb84bc09c5 Mon Sep 17 00:00:00 2001
|
||||
From: Hendrik Leppkes <h.leppkes@gmail.com>
|
||||
Date: Sat, 9 Jan 2016 16:34:09 +0100
|
||||
Subject: [PATCH 1/4] avcodec: add h264_mvc codec id and profiles
|
||||
@ -11,19 +11,19 @@ Subject: [PATCH 1/4] avcodec: add h264_mvc codec id and profiles
|
||||
4 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
|
||||
index d962b9cf0a..4c4581c895 100644
|
||||
index 880284d5bd..88e01645cd 100644
|
||||
--- a/libavcodec/avcodec.h
|
||||
+++ b/libavcodec/avcodec.h
|
||||
@@ -447,6 +447,8 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_GDV,
|
||||
AV_CODEC_ID_FITS,
|
||||
@@ -458,6 +458,8 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_LSCR,
|
||||
AV_CODEC_ID_VP4,
|
||||
|
||||
+ AV_CODEC_ID_H264_MVC,
|
||||
+
|
||||
/* various PCM "codecs" */
|
||||
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
|
||||
AV_CODEC_ID_PCM_S16LE = 0x10000,
|
||||
@@ -2895,6 +2897,7 @@ typedef struct AVCodecContext {
|
||||
@@ -2950,6 +2952,7 @@ typedef struct AVCodecContext {
|
||||
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
|
||||
#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)
|
||||
#define FF_PROFILE_H264_CAVLC_444 44
|
||||
@ -32,12 +32,12 @@ index d962b9cf0a..4c4581c895 100644
|
||||
#define FF_PROFILE_VC1_SIMPLE 0
|
||||
#define FF_PROFILE_VC1_MAIN 1
|
||||
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
|
||||
index 79552a910d..b55955476c 100644
|
||||
index 4d033c20ff..def006e033 100644
|
||||
--- a/libavcodec/codec_desc.c
|
||||
+++ b/libavcodec/codec_desc.c
|
||||
@@ -1647,6 +1647,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
|
||||
.long_name = NULL_IF_CONFIG_SMALL("FITS (Flexible Image Transport System)"),
|
||||
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
|
||||
@@ -1726,6 +1726,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
|
||||
.long_name = NULL_IF_CONFIG_SMALL("On2 VP4"),
|
||||
.props = AV_CODEC_PROP_LOSSY,
|
||||
},
|
||||
+ {
|
||||
+ .id = AV_CODEC_ID_H264_MVC,
|
||||
@ -50,10 +50,10 @@ index 79552a910d..b55955476c 100644
|
||||
/* various PCM "codecs" */
|
||||
{
|
||||
diff --git a/libavcodec/profiles.c b/libavcodec/profiles.c
|
||||
index d7dc960f36..e4651f12f9 100644
|
||||
index eaf0d68d32..fc1e152420 100644
|
||||
--- a/libavcodec/profiles.c
|
||||
+++ b/libavcodec/profiles.c
|
||||
@@ -72,6 +72,7 @@ const AVProfile ff_h264_profiles[] = {
|
||||
@@ -71,6 +71,7 @@ const AVProfile ff_h264_profiles[] = {
|
||||
{ FF_PROFILE_H264_CAVLC_444, "CAVLC 4:4:4" },
|
||||
{ FF_PROFILE_H264_MULTIVIEW_HIGH, "Multiview High" },
|
||||
{ FF_PROFILE_H264_STEREO_HIGH, "Stereo High" },
|
||||
@ -62,10 +62,10 @@ index d7dc960f36..e4651f12f9 100644
|
||||
};
|
||||
|
||||
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
|
||||
index 37a6aa8bff..52c5b659c4 100644
|
||||
index 0415ceea02..264bf9718b 100644
|
||||
--- a/libavformat/mpegts.c
|
||||
+++ b/libavformat/mpegts.c
|
||||
@@ -701,7 +701,7 @@ static const StreamType ISO_types[] = {
|
||||
@@ -798,7 +798,7 @@ static const StreamType ISO_types[] = {
|
||||
#endif
|
||||
{ 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264 },
|
||||
{ 0x1c, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC },
|
||||
@ -75,36 +75,21 @@ index 37a6aa8bff..52c5b659c4 100644
|
||||
{ 0x24, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
|
||||
{ 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS },
|
||||
--
|
||||
2.17.0
|
||||
2.20.1
|
||||
|
||||
|
||||
From 0f3fda4e348e6b12570f5d279713f6da46511846 Mon Sep 17 00:00:00 2001
|
||||
From 8d479b1b5395f97a8e5ee0eddab6680941edfb5b Mon Sep 17 00:00:00 2001
|
||||
From: Hendrik Leppkes <h.leppkes@gmail.com>
|
||||
Date: Sat, 9 Jan 2016 16:34:40 +0100
|
||||
Subject: [PATCH 2/4] h264_parser: add support for parsing h264 mvc NALUs
|
||||
|
||||
---
|
||||
libavcodec/h264.h | 2 ++
|
||||
libavcodec/h264_parser.c | 34 ++++++++++++++++++++++++++++++----
|
||||
libavcodec/parser.c | 1 +
|
||||
3 files changed, 33 insertions(+), 4 deletions(-)
|
||||
libavcodec/parsers.c | 1 +
|
||||
2 files changed, 31 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
|
||||
index 650580bf3a..c44a0cbedd 100644
|
||||
--- a/libavcodec/h264.h
|
||||
+++ b/libavcodec/h264.h
|
||||
@@ -41,7 +41,9 @@ enum {
|
||||
H264_NAL_END_STREAM = 11,
|
||||
H264_NAL_FILLER_DATA = 12,
|
||||
H264_NAL_SPS_EXT = 13,
|
||||
+ H264_NAL_SPS_SUBSET = 15,
|
||||
H264_NAL_AUXILIARY_SLICE = 19,
|
||||
+ H264_NAL_SLICE_EXT = 20,
|
||||
};
|
||||
|
||||
|
||||
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
|
||||
index 1a9840a62c..be8b9db9b0 100644
|
||||
index 5f9a9c46ef..991e8e82f3 100644
|
||||
--- a/libavcodec/h264_parser.c
|
||||
+++ b/libavcodec/h264_parser.c
|
||||
@@ -62,6 +62,7 @@ typedef struct H264ParseContext {
|
||||
@ -121,22 +106,22 @@ index 1a9840a62c..be8b9db9b0 100644
|
||||
if (nalu_type == H264_NAL_SEI || nalu_type == H264_NAL_SPS ||
|
||||
- nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD) {
|
||||
+ nalu_type == H264_NAL_PPS || nalu_type == H264_NAL_AUD ||
|
||||
+ nalu_type == H264_NAL_SPS_SUBSET) {
|
||||
+ nalu_type == H264_NAL_SUB_SPS) {
|
||||
if (pc->frame_start_found) {
|
||||
i++;
|
||||
goto found;
|
||||
}
|
||||
} else if (nalu_type == H264_NAL_SLICE || nalu_type == H264_NAL_DPA ||
|
||||
- nalu_type == H264_NAL_IDR_SLICE) {
|
||||
+ nalu_type == H264_NAL_IDR_SLICE || (p->is_mvc && nalu_type == H264_NAL_SLICE_EXT)) {
|
||||
+ nalu_type == H264_NAL_IDR_SLICE || (p->is_mvc && nalu_type == H264_NAL_EXTEN_SLICE)) {
|
||||
state += 8;
|
||||
+
|
||||
+ if (nalu_type == H264_NAL_SLICE_EXT)
|
||||
+ if (nalu_type == H264_NAL_EXTEN_SLICE)
|
||||
+ i += 3; // skip mvc extension
|
||||
continue;
|
||||
}
|
||||
state = 7;
|
||||
@@ -601,7 +606,8 @@ static int h264_parse(AVCodecParserContext *s,
|
||||
@@ -604,7 +609,8 @@ static int h264_parse(AVCodecParserContext *s,
|
||||
}
|
||||
}
|
||||
|
||||
@ -146,16 +131,16 @@ index 1a9840a62c..be8b9db9b0 100644
|
||||
|
||||
if (avctx->framerate.num)
|
||||
avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
|
||||
@@ -658,7 +664,7 @@ static int h264_split(AVCodecContext *avctx,
|
||||
@@ -661,7 +667,7 @@ static int h264_split(AVCodecContext *avctx,
|
||||
if ((state & 0xFFFFFF00) != 0x100)
|
||||
break;
|
||||
nalu_type = state & 0x1F;
|
||||
- if (nalu_type == H264_NAL_SPS) {
|
||||
+ if (nalu_type == H264_NAL_SPS || nalu_type == H264_NAL_SPS_SUBSET) {
|
||||
+ if (nalu_type == H264_NAL_SPS || nalu_type == H264_NAL_SUB_SPS) {
|
||||
has_sps = 1;
|
||||
} else if (nalu_type == H264_NAL_PPS)
|
||||
has_pps = 1;
|
||||
@@ -710,3 +716,23 @@ AVCodecParser ff_h264_parser = {
|
||||
@@ -713,3 +719,23 @@ AVCodecParser ff_h264_parser = {
|
||||
.parser_close = h264_close,
|
||||
.split = h264_split,
|
||||
};
|
||||
@ -179,11 +164,11 @@ index 1a9840a62c..be8b9db9b0 100644
|
||||
+ .parser_close = h264_close,
|
||||
+ .split = h264_split,
|
||||
+};
|
||||
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
|
||||
index f43b197d5e..f96e005ef3 100644
|
||||
--- a/libavcodec/parser.c
|
||||
+++ b/libavcodec/parser.c
|
||||
@@ -54,6 +54,7 @@ extern AVCodecParser ff_gsm_parser;
|
||||
diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c
|
||||
index 33a71de8a0..80b269b324 100644
|
||||
--- a/libavcodec/parsers.c
|
||||
+++ b/libavcodec/parsers.c
|
||||
@@ -47,6 +47,7 @@ extern AVCodecParser ff_gsm_parser;
|
||||
extern AVCodecParser ff_h261_parser;
|
||||
extern AVCodecParser ff_h263_parser;
|
||||
extern AVCodecParser ff_h264_parser;
|
||||
@ -192,10 +177,10 @@ index f43b197d5e..f96e005ef3 100644
|
||||
extern AVCodecParser ff_mjpeg_parser;
|
||||
extern AVCodecParser ff_mlp_parser;
|
||||
--
|
||||
2.17.0
|
||||
2.20.1
|
||||
|
||||
|
||||
From cdd668dc436b9c78dcb31df477e329492356e7ec Mon Sep 17 00:00:00 2001
|
||||
From e2cad00490c9cd339b9266e8b9fe5d86afe2abe1 Mon Sep 17 00:00:00 2001
|
||||
From: Hendrik Leppkes <h.leppkes@gmail.com>
|
||||
Date: Tue, 28 Nov 2017 16:12:12 +0000
|
||||
Subject: [PATCH 3/4] h264_parser: force grabing a new timestamp until a frame
|
||||
@ -206,10 +191,10 @@ Subject: [PATCH 3/4] h264_parser: force grabing a new timestamp until a frame
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
|
||||
index be8b9db9b0..81c9a1bbae 100644
|
||||
index 991e8e82f3..f573bd8629 100644
|
||||
--- a/libavcodec/h264_parser.c
|
||||
+++ b/libavcodec/h264_parser.c
|
||||
@@ -594,6 +594,9 @@ static int h264_parse(AVCodecParserContext *s,
|
||||
@@ -597,6 +597,9 @@ static int h264_parse(AVCodecParserContext *s,
|
||||
} else {
|
||||
next = h264_find_frame_end(p, buf, buf_size, avctx);
|
||||
|
||||
@ -220,10 +205,10 @@ index be8b9db9b0..81c9a1bbae 100644
|
||||
*poutbuf = NULL;
|
||||
*poutbuf_size = 0;
|
||||
--
|
||||
2.17.0
|
||||
2.20.1
|
||||
|
||||
|
||||
From fb0ec9a132d6eb8fd74348ef87b1176c7ca34a00 Mon Sep 17 00:00:00 2001
|
||||
From fc2954e5eba1791443016cdd17fcea280f464db5 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Mon, 28 May 2018 13:35:36 +0100
|
||||
Subject: [PATCH 4/4] fixup
|
||||
@ -233,46 +218,46 @@ Subject: [PATCH 4/4] fixup
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
|
||||
index 082b3e749b..7612749efc 100644
|
||||
index 85cf615ffa..b5f1657528 100644
|
||||
--- a/libavcodec/extract_extradata_bsf.c
|
||||
+++ b/libavcodec/extract_extradata_bsf.c
|
||||
@@ -59,7 +59,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
@@ -138,7 +138,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
HEVC_NAL_VPS, HEVC_NAL_SPS, HEVC_NAL_PPS,
|
||||
};
|
||||
static const int extradata_nal_types_h264[] = {
|
||||
- H264_NAL_SPS, H264_NAL_PPS,
|
||||
+ H264_NAL_SPS, H264_NAL_SPS_SUBSET, H264_NAL_PPS,
|
||||
+ H264_NAL_SPS, H264_NAL_SUB_SPS, H264_NAL_PPS,
|
||||
};
|
||||
|
||||
ExtractExtradataContext *s = ctx->priv_data;
|
||||
@@ -90,7 +90,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
@@ -169,7 +169,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
if (nal->type == HEVC_NAL_SPS) has_sps = 1;
|
||||
if (nal->type == HEVC_NAL_VPS) has_vps = 1;
|
||||
} else {
|
||||
- if (nal->type == H264_NAL_SPS) has_sps = 1;
|
||||
+ if (nal->type == H264_NAL_SPS || nal->type == H264_NAL_SPS_SUBSET) has_sps = 1;
|
||||
+ if (nal->type == H264_NAL_SPS || nal->type == H264_NAL_SUB_SPS) has_sps = 1;
|
||||
}
|
||||
} else if (s->remove) {
|
||||
filtered_size += nal->raw_size + 3;
|
||||
@@ -99,7 +99,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
@@ -178,7 +178,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
|
||||
|
||||
if (extradata_size &&
|
||||
((ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
|
||||
- (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
|
||||
+ ((ctx->par_in->codec_id == AV_CODEC_ID_H264 || ctx->par_in->codec_id == AV_CODEC_ID_H264_MVC) && has_sps))) {
|
||||
AVBufferRef *filtered_buf;
|
||||
AVBufferRef *filtered_buf = NULL;
|
||||
uint8_t *extradata, *filtered_data;
|
||||
|
||||
@@ -253,6 +253,7 @@ static const struct {
|
||||
} extract_tab[] = {
|
||||
@@ -334,6 +334,7 @@ static const struct {
|
||||
{ AV_CODEC_ID_AVS2, extract_extradata_mpeg4 },
|
||||
{ AV_CODEC_ID_CAVS, extract_extradata_mpeg4 },
|
||||
{ AV_CODEC_ID_H264, extract_extradata_h2645 },
|
||||
+ { AV_CODEC_ID_H264_MVC, extract_extradata_h2645 },
|
||||
{ AV_CODEC_ID_HEVC, extract_extradata_h2645 },
|
||||
{ AV_CODEC_ID_MPEG1VIDEO, extract_extradata_mpeg12 },
|
||||
{ AV_CODEC_ID_MPEG2VIDEO, extract_extradata_mpeg12 },
|
||||
@@ -317,6 +318,7 @@ static void extract_extradata_close(AVBSFContext *ctx)
|
||||
static const enum AVCodecID codec_ids[] = {
|
||||
@@ -401,6 +402,7 @@ static const enum AVCodecID codec_ids[] = {
|
||||
AV_CODEC_ID_AVS2,
|
||||
AV_CODEC_ID_CAVS,
|
||||
AV_CODEC_ID_H264,
|
||||
+ AV_CODEC_ID_H264_MVC,
|
||||
@ -280,5 +265,5 @@ index 082b3e749b..7612749efc 100644
|
||||
AV_CODEC_ID_MPEG1VIDEO,
|
||||
AV_CODEC_ID_MPEG2VIDEO,
|
||||
--
|
||||
2.17.0
|
||||
2.20.1
|
||||
|
||||
|
@ -1,407 +0,0 @@
|
||||
diff -Nur a/configure b/configure
|
||||
--- a/configure 2018-11-23 12:03:27.041287929 -0500
|
||||
+++ b/configure 2018-11-23 12:08:52.945786916 -0500
|
||||
@@ -226,6 +226,7 @@
|
||||
--enable-libcelt enable CELT decoding via libcelt [no]
|
||||
--enable-libcdio enable audio CD grabbing with libcdio [no]
|
||||
--enable-libcodec2 enable codec2 en/decoding using libcodec2 [no]
|
||||
+ --enable-libdav1d enable AV1 decoding via libdav1d [no]
|
||||
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
|
||||
and libraw1394 [no]
|
||||
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
|
||||
@@ -1700,6 +1701,7 @@
|
||||
libcaca
|
||||
libcelt
|
||||
libcodec2
|
||||
+ libdav1d
|
||||
libdc1394
|
||||
libdrm
|
||||
libflite
|
||||
@@ -3062,6 +3064,7 @@
|
||||
libcelt_decoder_deps="libcelt"
|
||||
libcodec2_decoder_deps="libcodec2"
|
||||
libcodec2_encoder_deps="libcodec2"
|
||||
+libdav1d_decoder_deps="libdav1d"
|
||||
libfdk_aac_decoder_deps="libfdk_aac"
|
||||
libfdk_aac_encoder_deps="libfdk_aac"
|
||||
libfdk_aac_encoder_select="audio_frame_queue"
|
||||
@@ -6003,6 +6006,7 @@
|
||||
die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
|
||||
enabled libcaca && require_pkg_config libcaca caca caca.h caca_create_canvas
|
||||
enabled libcodec2 && require libcodec2 codec2/codec2.h codec2_create -lcodec2
|
||||
+enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.0.1" "dav1d/dav1d.h" dav1d_version
|
||||
enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
|
||||
enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
|
||||
enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
|
||||
diff -Nur a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
|
||||
--- a/libavcodec/allcodecs.c 2018-11-23 12:03:27.041287929 -0500
|
||||
+++ b/libavcodec/allcodecs.c 2018-11-23 12:11:08.584268221 -0500
|
||||
@@ -670,6 +670,7 @@
|
||||
extern AVCodec ff_libcelt_decoder;
|
||||
extern AVCodec ff_libcodec2_encoder;
|
||||
extern AVCodec ff_libcodec2_decoder;
|
||||
+extern AVCodec ff_libdav1d_decoder;
|
||||
extern AVCodec ff_libfdk_aac_encoder;
|
||||
extern AVCodec ff_libfdk_aac_decoder;
|
||||
extern AVCodec ff_libgsm_encoder;
|
||||
diff -Nur a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
|
||||
--- a/libavcodec/libdav1d.c 1969-12-31 19:00:00.000000000 -0500
|
||||
+++ b/libavcodec/libdav1d.c 2018-11-23 12:33:35.820468086 -0500
|
||||
@@ -0,0 +1,346 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2018 Ronald S. Bultje <rsbultje gmail com>
|
||||
+ * Copyright (c) 2018 James Almer <jamrial gmail com>
|
||||
+ *
|
||||
+ * This file is part of FFmpeg.
|
||||
+ *
|
||||
+ * FFmpeg is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2.1 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * FFmpeg is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with FFmpeg; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+ */
|
||||
+
|
||||
+#include <dav1d/dav1d.h>
|
||||
+
|
||||
+#include "libavutil/avassert.h"
|
||||
+#include "libavutil/mastering_display_metadata.h"
|
||||
+#include "libavutil/imgutils.h"
|
||||
+#include "libavutil/opt.h"
|
||||
+
|
||||
+#include "avcodec.h"
|
||||
+#include "decode.h"
|
||||
+#include "internal.h"
|
||||
+
|
||||
+typedef struct Libdav1dContext {
|
||||
+ AVClass *class;
|
||||
+ Dav1dContext *c;
|
||||
+ AVBufferPool *pool;
|
||||
+ int pool_size;
|
||||
+
|
||||
+ Dav1dData data;
|
||||
+ int tile_threads;
|
||||
+ int apply_grain;
|
||||
+} Libdav1dContext;
|
||||
+
|
||||
+static const enum AVPixelFormat pix_fmt[][3] = {
|
||||
+ [DAV1D_PIXEL_LAYOUT_I400] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12 },
|
||||
+ [DAV1D_PIXEL_LAYOUT_I420] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12 },
|
||||
+ [DAV1D_PIXEL_LAYOUT_I422] = { AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12 },
|
||||
+ [DAV1D_PIXEL_LAYOUT_I444] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12 },
|
||||
+};
|
||||
+
|
||||
+static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
|
||||
+{
|
||||
+ AVCodecContext *c = opaque;
|
||||
+
|
||||
+ av_vlog(c, AV_LOG_ERROR, fmt, vl);
|
||||
+}
|
||||
+
|
||||
+static int libdav1d_picture_allocator(Dav1dPicture *p, void *cookie)
|
||||
+{
|
||||
+ Libdav1dContext *dav1d = cookie;
|
||||
+ enum AVPixelFormat format = pix_fmt[p->p.layout][p->seq_hdr->hbd];
|
||||
+ int ret, linesize[4], h = FFALIGN(p->p.h, 128);
|
||||
+ uint8_t *aligned_ptr, *data[4];
|
||||
+ AVBufferRef *buf;
|
||||
+
|
||||
+ ret = av_image_fill_arrays(data, linesize, NULL, format, FFALIGN(p->p.w, 128),
|
||||
+ h, DAV1D_PICTURE_ALIGNMENT);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (ret != dav1d->pool_size) {
|
||||
+ av_buffer_pool_uninit(&dav1d->pool);
|
||||
+ // Use twice the amount of required padding bytes for aligned_ptr below.
|
||||
+ dav1d->pool = av_buffer_pool_init(ret + DAV1D_PICTURE_ALIGNMENT * 2, NULL);
|
||||
+ if (!dav1d->pool) {
|
||||
+ dav1d->pool_size = 0;
|
||||
+ return AVERROR(ENOMEM);
|
||||
+ }
|
||||
+ dav1d->pool_size = ret;
|
||||
+ }
|
||||
+ buf = av_buffer_pool_get(dav1d->pool);
|
||||
+ if (!buf)
|
||||
+ return AVERROR(ENOMEM);
|
||||
+
|
||||
+ // libdav1d requires DAV1D_PICTURE_ALIGNMENT aligned buffers, which av_malloc()
|
||||
+ // doesn't guarantee for example when AVX is disabled at configure time.
|
||||
+ // Use the extra DAV1D_PICTURE_ALIGNMENT padding bytes in the buffer to align it
|
||||
+ // if required.
|
||||
+ aligned_ptr = (uint8_t *)FFALIGN((uintptr_t)buf->data, DAV1D_PICTURE_ALIGNMENT);
|
||||
+ ret = av_image_fill_pointers(data, format, h, aligned_ptr, linesize);
|
||||
+ if (ret < 0) {
|
||||
+ av_buffer_unref(&buf);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ p->data[0] = data[0];
|
||||
+ p->data[1] = data[1];
|
||||
+ p->data[2] = data[2];
|
||||
+ p->stride[0] = linesize[0];
|
||||
+ p->stride[1] = linesize[1];
|
||||
+ p->allocator_data = buf;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void libdav1d_picture_release(Dav1dPicture *p, void *cookie)
|
||||
+{
|
||||
+ AVBufferRef *buf = p->allocator_data;
|
||||
+
|
||||
+ av_buffer_unref(&buf);
|
||||
+}
|
||||
+
|
||||
+static av_cold int libdav1d_init(AVCodecContext *c)
|
||||
+{
|
||||
+ Libdav1dContext *dav1d = c->priv_data;
|
||||
+ Dav1dSettings s;
|
||||
+ int res;
|
||||
+
|
||||
+ av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version());
|
||||
+
|
||||
+ dav1d_default_settings(&s);
|
||||
+ s.logger.cookie = c;
|
||||
+ s.logger.callback = libdav1d_log_callback;
|
||||
+ s.allocator.cookie = dav1d;
|
||||
+ s.allocator.alloc_picture_callback = libdav1d_picture_allocator;
|
||||
+ s.allocator.release_picture_callback = libdav1d_picture_release;
|
||||
+ s.n_tile_threads = dav1d->tile_threads;
|
||||
+ s.apply_grain = dav1d->apply_grain;
|
||||
+ s.n_frame_threads = FFMIN(c->thread_count ? c->thread_count : av_cpu_count(), DAV1D_MAX_FRAME_THREADS);
|
||||
+
|
||||
+ res = dav1d_open(&dav1d->c, &s);
|
||||
+ if (res < 0)
|
||||
+ return AVERROR(ENOMEM);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void libdav1d_flush(AVCodecContext *c)
|
||||
+{
|
||||
+ Libdav1dContext *dav1d = c->priv_data;
|
||||
+
|
||||
+ dav1d_data_unref(&dav1d->data);
|
||||
+ dav1d_flush(dav1d->c);
|
||||
+}
|
||||
+
|
||||
+static void libdav1d_data_free(const uint8_t *data, void *opaque) {
|
||||
+ AVBufferRef *buf = opaque;
|
||||
+
|
||||
+ av_buffer_unref(&buf);
|
||||
+}
|
||||
+
|
||||
+static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
|
||||
+{
|
||||
+ Libdav1dContext *dav1d = c->priv_data;
|
||||
+ Dav1dData *data = &dav1d->data;
|
||||
+ Dav1dPicture pic = { 0 }, *p = &pic;
|
||||
+ int res;
|
||||
+
|
||||
+ if (!data->sz) {
|
||||
+ AVPacket pkt = { 0 };
|
||||
+
|
||||
+ res = ff_decode_get_packet(c, &pkt);
|
||||
+ if (res < 0 && res != AVERROR_EOF)
|
||||
+ return res;
|
||||
+
|
||||
+ if (pkt.size) {
|
||||
+ res = dav1d_data_wrap(data, pkt.data, pkt.size, libdav1d_data_free, pkt.buf);
|
||||
+ if (res < 0) {
|
||||
+ av_packet_unref(&pkt);
|
||||
+ return res;
|
||||
+ }
|
||||
+
|
||||
+ data->m.timestamp = pkt.pts;
|
||||
+ data->m.offset = pkt.pos;
|
||||
+ data->m.duration = pkt.duration;
|
||||
+
|
||||
+ pkt.buf = NULL;
|
||||
+ av_packet_unref(&pkt);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ res = dav1d_send_data(dav1d->c, data);
|
||||
+ if (res < 0) {
|
||||
+ if (res == AVERROR(EINVAL))
|
||||
+ res = AVERROR_INVALIDDATA;
|
||||
+ if (res != AVERROR(EAGAIN))
|
||||
+ return res;
|
||||
+ }
|
||||
+
|
||||
+ res = dav1d_get_picture(dav1d->c, p);
|
||||
+ if (res < 0) {
|
||||
+ if (res == AVERROR(EINVAL))
|
||||
+ res = AVERROR_INVALIDDATA;
|
||||
+ else if (res == AVERROR(EAGAIN) && c->internal->draining)
|
||||
+ res = AVERROR_EOF;
|
||||
+
|
||||
+ return res;
|
||||
+ }
|
||||
+
|
||||
+ av_assert0(p->data[0] != NULL);
|
||||
+
|
||||
+ // This requires the custom allocator above
|
||||
+ frame->buf[0] = av_buffer_ref(p->allocator_data);
|
||||
+ if (!frame->buf[0]) {
|
||||
+ dav1d_picture_unref(p);
|
||||
+ return AVERROR(ENOMEM);
|
||||
+ }
|
||||
+
|
||||
+ frame->data[0] = p->data[0];
|
||||
+ frame->data[1] = p->data[1];
|
||||
+ frame->data[2] = p->data[2];
|
||||
+ frame->linesize[0] = p->stride[0];
|
||||
+ frame->linesize[1] = p->stride[1];
|
||||
+ frame->linesize[2] = p->stride[1];
|
||||
+
|
||||
+ c->profile = p->seq_hdr->profile;
|
||||
+ frame->format = c->pix_fmt = pix_fmt[p->p.layout][p->seq_hdr->hbd];
|
||||
+ frame->width = p->p.w;
|
||||
+ frame->height = p->p.h;
|
||||
+ if (c->width != p->p.w || c->height != p->p.h) {
|
||||
+ res = ff_set_dimensions(c, p->p.w, p->p.h);
|
||||
+ if (res < 0)
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ switch (p->seq_hdr->chr) {
|
||||
+ case DAV1D_CHR_VERTICAL:
|
||||
+ frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_LEFT;
|
||||
+ break;
|
||||
+ case DAV1D_CHR_COLOCATED:
|
||||
+ frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
|
||||
+ break;
|
||||
+ }
|
||||
+ frame->colorspace = c->colorspace = (enum AVColorSpace) p->seq_hdr->mtrx;
|
||||
+ frame->color_primaries = c->color_primaries = (enum AVColorPrimaries) p->seq_hdr->pri;
|
||||
+ frame->color_trc = c->color_trc = (enum AVColorTransferCharacteristic) p->seq_hdr->trc;
|
||||
+ frame->color_range = c->color_range = p->seq_hdr->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
|
||||
+
|
||||
+ // match timestamps and packet size
|
||||
+ frame->pts = frame->best_effort_timestamp = p->m.timestamp;
|
||||
+#if FF_API_PKT_PTS
|
||||
+FF_DISABLE_DEPRECATION_WARNINGS
|
||||
+ frame->pkt_pts = p->m.timestamp;
|
||||
+FF_ENABLE_DEPRECATION_WARNINGS
|
||||
+#endif
|
||||
+ frame->pkt_dts = p->m.timestamp;
|
||||
+ frame->pkt_pos = p->m.offset;
|
||||
+ frame->pkt_size = p->m.size;
|
||||
+ frame->pkt_duration = p->m.duration;
|
||||
+ frame->key_frame = p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY;
|
||||
+
|
||||
+ switch (p->frame_hdr->frame_type) {
|
||||
+ case DAV1D_FRAME_TYPE_KEY:
|
||||
+ case DAV1D_FRAME_TYPE_INTRA:
|
||||
+ frame->pict_type = AV_PICTURE_TYPE_I;
|
||||
+ break;
|
||||
+ case DAV1D_FRAME_TYPE_INTER:
|
||||
+ frame->pict_type = AV_PICTURE_TYPE_P;
|
||||
+ break;
|
||||
+ case DAV1D_FRAME_TYPE_SWITCH:
|
||||
+ frame->pict_type = AV_PICTURE_TYPE_SP;
|
||||
+ break;
|
||||
+ default:
|
||||
+ res = AVERROR_INVALIDDATA;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (p->mastering_display) {
|
||||
+ AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame);
|
||||
+ if (!mastering) {
|
||||
+ res = AVERROR(ENOMEM);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ for (int i = 0; i < 3; i++) {
|
||||
+ mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16);
|
||||
+ mastering->display_primaries[i][1] = av_make_q(p->mastering_display->primaries[i][1], 1 << 16);
|
||||
+ }
|
||||
+ mastering->white_point[0] = av_make_q(p->mastering_display->white_point[0], 1 << 16);
|
||||
+ mastering->white_point[1] = av_make_q(p->mastering_display->white_point[1], 1 << 16);
|
||||
+
|
||||
+ mastering->max_luminance = av_make_q(p->mastering_display->max_luminance, 1 << 8);
|
||||
+ mastering->min_luminance = av_make_q(p->mastering_display->min_luminance, 1 << 14);
|
||||
+
|
||||
+ mastering->has_primaries = 1;
|
||||
+ mastering->has_luminance = 1;
|
||||
+ }
|
||||
+ if (p->content_light) {
|
||||
+ AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame);
|
||||
+ if (!light) {
|
||||
+ res = AVERROR(ENOMEM);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ light->MaxCLL = p->content_light->max_content_light_level;
|
||||
+ light->MaxFALL = p->content_light->max_frame_average_light_level;
|
||||
+ }
|
||||
+
|
||||
+ res = 0;
|
||||
+fail:
|
||||
+ dav1d_picture_unref(p);
|
||||
+ if (res < 0)
|
||||
+ av_frame_unref(frame);
|
||||
+ return res;
|
||||
+}
|
||||
+
|
||||
+static av_cold int libdav1d_close(AVCodecContext *c)
|
||||
+{
|
||||
+ Libdav1dContext *dav1d = c->priv_data;
|
||||
+
|
||||
+ av_buffer_pool_uninit(&dav1d->pool);
|
||||
+ dav1d_data_unref(&dav1d->data);
|
||||
+ dav1d_close(&dav1d->c);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define OFFSET(x) offsetof(Libdav1dContext, x)
|
||||
+#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
|
||||
+static const AVOption libdav1d_options[] = {
|
||||
+ { "tilethreads", "Tile threads", OFFSET(tile_threads), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, DAV1D_MAX_TILE_THREADS, VD },
|
||||
+ { "filmgrain", "Apply Film Grain", OFFSET(apply_grain), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VD },
|
||||
+ { NULL }
|
||||
+};
|
||||
+
|
||||
+static const AVClass libdav1d_class = {
|
||||
+ .class_name = "libdav1d decoder",
|
||||
+ .item_name = av_default_item_name,
|
||||
+ .option = libdav1d_options,
|
||||
+ .version = LIBAVUTIL_VERSION_INT,
|
||||
+};
|
||||
+
|
||||
+AVCodec ff_libdav1d_decoder = {
|
||||
+ .name = "libdav1d",
|
||||
+ .long_name = NULL_IF_CONFIG_SMALL("dav1d AV1 decoder by VideoLAN"),
|
||||
+ .type = AVMEDIA_TYPE_VIDEO,
|
||||
+ .id = AV_CODEC_ID_AV1,
|
||||
+ .priv_data_size = sizeof(Libdav1dContext),
|
||||
+ .init = libdav1d_init,
|
||||
+ .close = libdav1d_close,
|
||||
+ .flush = libdav1d_flush,
|
||||
+ .receive_frame = libdav1d_receive_frame,
|
||||
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
|
||||
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_SETS_PKT_DTS,
|
||||
+ .priv_class = &libdav1d_class,
|
||||
+ .wrapper_name = "libdav1d",
|
||||
+};
|
||||
diff -Nur a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
--- a/libavcodec/Makefile 2018-11-23 12:03:27.041287929 -0500
|
||||
+++ b/libavcodec/Makefile 2018-11-23 12:10:28.676717867 -0500
|
||||
@@ -954,6 +954,7 @@
|
||||
OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o
|
||||
OBJS-$(CONFIG_LIBCODEC2_DECODER) += libcodec2.o codec2utils.o
|
||||
OBJS-$(CONFIG_LIBCODEC2_ENCODER) += libcodec2.o codec2utils.o
|
||||
+OBJS-$(CONFIG_LIBDAV1D_DECODER) += libdav1d.o
|
||||
OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o
|
||||
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o
|
||||
OBJS-$(CONFIG_LIBGSM_DECODER) += libgsmdec.o
|
@ -1,36 +1,25 @@
|
||||
From 0ae5ba3567a896af2b272e3a52ca574b7f41ec5a Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Wed, 10 Apr 2019 13:40:07 -0700
|
||||
Subject: [PATCH 0/1] *** SUBJECT HERE ***
|
||||
commit 578b5ee8c0fe7d9ef09ef91ffcafc916f1d7d97b
|
||||
Author: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Wed Apr 10 13:39:21 2019 -0700
|
||||
|
||||
*** BLURB HERE ***
|
||||
|
||||
Lukas Rusak (1):
|
||||
libavcodec/libdav1d: add libdav1d_get_format method in order to call
|
||||
ff_get_format
|
||||
|
||||
libavcodec/libdav1d.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
||||
From 0ae5ba3567a896af2b272e3a52ca574b7f41ec5a Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Wed, 10 Apr 2019 13:39:21 -0700
|
||||
Subject: [PATCH 1/1] libavcodec/libdav1d: add libdav1d_get_format method in
|
||||
order to call ff_get_format
|
||||
|
||||
---
|
||||
libavcodec/libdav1d.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
libavcodec/libdav1d: add libdav1d_get_format method to call ff_get_format
|
||||
|
||||
This will allow applications to properly init the decoder in
|
||||
cases where a hardware decoder is tried first and and software
|
||||
decoder is tried after by calling the get_format callback.
|
||||
|
||||
Even though there is no hardware pixel formats available
|
||||
we still need to return the software pixel format.
|
||||
|
||||
Tested with Kodi by checking if multithreaded software
|
||||
decoding is properly activated.
|
||||
|
||||
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
|
||||
index 30c6eccfef..fa71834543 100644
|
||||
index 12c63245f8..1bbb83eda3 100644
|
||||
--- a/libavcodec/libdav1d.c
|
||||
+++ b/libavcodec/libdav1d.c
|
||||
@@ -48,6 +48,16 @@ static const enum AVPixelFormat pix_fmt[][3] = {
|
||||
[DAV1D_PIXEL_LAYOUT_I444] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12 },
|
||||
@@ -53,6 +53,16 @@ static const enum AVPixelFormat pix_fmt_rgb[3] = {
|
||||
AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
|
||||
};
|
||||
|
||||
+static enum AVPixelFormat libdav1d_get_format(AVCodecContext *avctx, const Dav1dPicture *p)
|
||||
@ -46,15 +35,11 @@ index 30c6eccfef..fa71834543 100644
|
||||
static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
|
||||
{
|
||||
AVCodecContext *c = opaque;
|
||||
@@ -214,7 +224,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
|
||||
frame->linesize[2] = p->stride[1];
|
||||
|
||||
@@ -229,6 +239,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
|
||||
c->profile = p->seq_hdr->profile;
|
||||
- frame->format = c->pix_fmt = pix_fmt[p->p.layout][p->seq_hdr->hbd];
|
||||
c->level = ((p->seq_hdr->operating_points[0].major_level - 2) << 2)
|
||||
| p->seq_hdr->operating_points[0].minor_level;
|
||||
+ frame->format = c->pix_fmt = libdav1d_get_format(c, p);
|
||||
frame->width = p->p.w;
|
||||
frame->height = p->p.h;
|
||||
if (c->width != p->p.w || c->height != p->p.h) {
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
@ -1,5 +1,192 @@
|
||||
From 27e3340bc0e488abde669f91dfae5d5bf535ad02 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Fri, 31 Jan 2020 11:27:22 +0000
|
||||
Subject: [PATCH] pi: hevc acclerated support by pfcd/jc
|
||||
|
||||
---
|
||||
.gitignore | 2 +
|
||||
configure | 7 +
|
||||
fftools/ffmpeg.c | 291 +-
|
||||
fftools/ffmpeg_filter.c | 4 +-
|
||||
fftools/ffmpeg_opt.c | 8 +
|
||||
libavcodec/Makefile | 37 +
|
||||
libavcodec/allcodecs.c | 36 +
|
||||
libavcodec/arm/Makefile | 16 +
|
||||
libavcodec/arm/cabac.h | 262 +-
|
||||
libavcodec/arm/rpi_hevc_cabac.h | 605 ++
|
||||
libavcodec/arm/rpi_hevc_idct_fn_neon.S | 161 +
|
||||
libavcodec/arm/rpi_hevc_misc_neon.S | 238 +
|
||||
libavcodec/arm/rpi_hevc_misc_neon.h | 438 ++
|
||||
libavcodec/arm/rpi_hevc_mv_arm.h | 64 +
|
||||
libavcodec/arm/rpi_hevcdsp_arm.h | 26 +
|
||||
libavcodec/arm/rpi_hevcdsp_deblock_neon.S | 1633 +++++
|
||||
libavcodec/arm/rpi_hevcdsp_idct_neon.S | 183 +
|
||||
libavcodec/arm/rpi_hevcdsp_init_arm.c | 32 +
|
||||
libavcodec/arm/rpi_hevcdsp_init_neon.c | 467 ++
|
||||
libavcodec/arm/rpi_hevcdsp_res16_neon.S | 591 ++
|
||||
libavcodec/arm/rpi_hevcdsp_res8_neon.S | 712 ++
|
||||
libavcodec/arm/rpi_hevcdsp_sao_neon.S | 2245 ++++++
|
||||
libavcodec/arm/rpi_hevcpred_arm.h | 28 +
|
||||
libavcodec/arm/rpi_hevcpred_init_arm.c | 35 +
|
||||
libavcodec/arm/rpi_hevcpred_init_neon.c | 210 +
|
||||
.../arm/rpi_hevcpred_intra_angular_neon.S | 2975 ++++++++
|
||||
libavcodec/arm/rpi_hevcpred_intra_dc_neon.S | 695 ++
|
||||
.../arm/rpi_hevcpred_intra_filter_neon.S | 872 +++
|
||||
libavcodec/arm/rpi_hevcpred_intra_hv_neon.S | 911 +++
|
||||
.../arm/rpi_hevcpred_intra_planar_neon.S | 1034 +++
|
||||
libavcodec/avcodec.h | 19 +-
|
||||
libavcodec/cabac.h | 9 +-
|
||||
libavcodec/mmaldec.c | 4 +
|
||||
libavcodec/raw.c | 4 +
|
||||
libavcodec/rawenc.c | 62 +
|
||||
libavcodec/rpi_hevc_cabac.c | 2255 ++++++
|
||||
libavcodec/rpi_hevc_cabac_fns.h | 191 +
|
||||
libavcodec/rpi_hevc_data.c | 75 +
|
||||
libavcodec/rpi_hevc_data.h | 31 +
|
||||
libavcodec/rpi_hevc_filter.c | 1206 ++++
|
||||
libavcodec/rpi_hevc_mv.h | 71 +
|
||||
libavcodec/rpi_hevc_mvs.c | 486 ++
|
||||
libavcodec/rpi_hevc_parse.c | 142 +
|
||||
libavcodec/rpi_hevc_parse.h | 36 +
|
||||
libavcodec/rpi_hevc_ps.c | 1936 ++++++
|
||||
libavcodec/rpi_hevc_ps.h | 447 ++
|
||||
libavcodec/rpi_hevc_refs.c | 485 ++
|
||||
libavcodec/rpi_hevc_sei.c | 368 +
|
||||
libavcodec/rpi_hevc_sei.h | 135 +
|
||||
libavcodec/rpi_hevc_shader.c | 1537 +++++
|
||||
libavcodec/rpi_hevc_shader.h | 63 +
|
||||
libavcodec/rpi_hevc_shader.qasm | 1821 +++++
|
||||
libavcodec/rpi_hevc_shader_cmd.h | 128 +
|
||||
libavcodec/rpi_hevc_shader_template.c | 61 +
|
||||
libavcodec/rpi_hevc_shader_template.h | 22 +
|
||||
libavcodec/rpi_hevc_shader_template_fn.h | 475 ++
|
||||
libavcodec/rpi_hevc_transform.s | 444 ++
|
||||
libavcodec/rpi_hevc_transform10.h | 94 +
|
||||
libavcodec/rpi_hevc_transform8.h | 94 +
|
||||
libavcodec/rpi_hevcdec.c | 6016 +++++++++++++++++
|
||||
libavcodec/rpi_hevcdec.h | 1087 +++
|
||||
libavcodec/rpi_hevcdsp.c | 450 ++
|
||||
libavcodec/rpi_hevcdsp.h | 177 +
|
||||
libavcodec/rpi_hevcdsp_template.c | 2278 +++++++
|
||||
libavcodec/rpi_hevcpred.c | 166 +
|
||||
libavcodec/rpi_hevcpred.h | 121 +
|
||||
libavcodec/rpi_hevcpred_template.c | 1522 +++++
|
||||
libavcodec/rpi_mailbox.c | 107 +
|
||||
libavcodec/rpi_mailbox.h | 55 +
|
||||
libavcodec/rpi_qpu.c | 957 +++
|
||||
libavcodec/rpi_qpu.h | 229 +
|
||||
libavcodec/rpi_zc.c | 741 ++
|
||||
libavcodec/rpi_zc.h | 105 +
|
||||
libavfilter/Makefile | 1 +
|
||||
libavfilter/allfilters.c | 1 +
|
||||
libavfilter/avfiltergraph.c | 86 +-
|
||||
libavfilter/buffersrc.c | 2 +-
|
||||
libavfilter/vf_unsand.c | 232 +
|
||||
libavformat/utils.c | 65 +-
|
||||
libavutil/Makefile | 1 +
|
||||
libavutil/arm/Makefile | 1 +
|
||||
libavutil/arm/rpi_sand_neon.S | 40 +
|
||||
libavutil/buffer.c | 6 +
|
||||
libavutil/buffer.h | 3 +
|
||||
libavutil/frame.c | 11 +
|
||||
libavutil/frame.h | 10 +
|
||||
libavutil/pixdesc.c | 24 +
|
||||
libavutil/pixfmt.h | 4 +
|
||||
libavutil/rpi_sand_fn_pw.h | 182 +
|
||||
libavutil/rpi_sand_fns.c | 151 +
|
||||
libavutil/rpi_sand_fns.h | 136 +
|
||||
pi-util/BUILD.txt | 25 +
|
||||
pi-util/conf_h265.2016.csv | 195 +
|
||||
pi-util/conf_h265.2016_HEVC_v1.csv | 147 +
|
||||
pi-util/conf_h265.csv | 144 +
|
||||
pi-util/conf_pi1.sh | 30 +
|
||||
pi-util/conf_pi2.sh | 32 +
|
||||
pi-util/ffconf.py | 175 +
|
||||
pi-util/ffperf.py | 125 +
|
||||
pi-util/make_array.py | 23 +
|
||||
pi-util/perfcmp.py | 101 +
|
||||
pi-util/qem.sh | 9 +
|
||||
pi-util/v3dusage.py | 128 +
|
||||
103 files changed, 43525 insertions(+), 95 deletions(-)
|
||||
create mode 100644 libavcodec/arm/rpi_hevc_cabac.h
|
||||
create mode 100644 libavcodec/arm/rpi_hevc_idct_fn_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevc_misc_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevc_misc_neon.h
|
||||
create mode 100644 libavcodec/arm/rpi_hevc_mv_arm.h
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_arm.h
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_deblock_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_idct_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_init_arm.c
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_init_neon.c
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_res16_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_res8_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcdsp_sao_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_arm.h
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_init_arm.c
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_init_neon.c
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_intra_angular_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_intra_dc_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_intra_filter_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_intra_hv_neon.S
|
||||
create mode 100644 libavcodec/arm/rpi_hevcpred_intra_planar_neon.S
|
||||
create mode 100644 libavcodec/rpi_hevc_cabac.c
|
||||
create mode 100644 libavcodec/rpi_hevc_cabac_fns.h
|
||||
create mode 100644 libavcodec/rpi_hevc_data.c
|
||||
create mode 100644 libavcodec/rpi_hevc_data.h
|
||||
create mode 100644 libavcodec/rpi_hevc_filter.c
|
||||
create mode 100644 libavcodec/rpi_hevc_mv.h
|
||||
create mode 100644 libavcodec/rpi_hevc_mvs.c
|
||||
create mode 100644 libavcodec/rpi_hevc_parse.c
|
||||
create mode 100644 libavcodec/rpi_hevc_parse.h
|
||||
create mode 100644 libavcodec/rpi_hevc_ps.c
|
||||
create mode 100644 libavcodec/rpi_hevc_ps.h
|
||||
create mode 100644 libavcodec/rpi_hevc_refs.c
|
||||
create mode 100644 libavcodec/rpi_hevc_sei.c
|
||||
create mode 100644 libavcodec/rpi_hevc_sei.h
|
||||
create mode 100644 libavcodec/rpi_hevc_shader.c
|
||||
create mode 100644 libavcodec/rpi_hevc_shader.h
|
||||
create mode 100644 libavcodec/rpi_hevc_shader.qasm
|
||||
create mode 100644 libavcodec/rpi_hevc_shader_cmd.h
|
||||
create mode 100644 libavcodec/rpi_hevc_shader_template.c
|
||||
create mode 100644 libavcodec/rpi_hevc_shader_template.h
|
||||
create mode 100644 libavcodec/rpi_hevc_shader_template_fn.h
|
||||
create mode 100644 libavcodec/rpi_hevc_transform.s
|
||||
create mode 100644 libavcodec/rpi_hevc_transform10.h
|
||||
create mode 100644 libavcodec/rpi_hevc_transform8.h
|
||||
create mode 100644 libavcodec/rpi_hevcdec.c
|
||||
create mode 100644 libavcodec/rpi_hevcdec.h
|
||||
create mode 100644 libavcodec/rpi_hevcdsp.c
|
||||
create mode 100644 libavcodec/rpi_hevcdsp.h
|
||||
create mode 100644 libavcodec/rpi_hevcdsp_template.c
|
||||
create mode 100644 libavcodec/rpi_hevcpred.c
|
||||
create mode 100644 libavcodec/rpi_hevcpred.h
|
||||
create mode 100644 libavcodec/rpi_hevcpred_template.c
|
||||
create mode 100644 libavcodec/rpi_mailbox.c
|
||||
create mode 100644 libavcodec/rpi_mailbox.h
|
||||
create mode 100644 libavcodec/rpi_qpu.c
|
||||
create mode 100644 libavcodec/rpi_qpu.h
|
||||
create mode 100644 libavcodec/rpi_zc.c
|
||||
create mode 100644 libavcodec/rpi_zc.h
|
||||
create mode 100644 libavfilter/vf_unsand.c
|
||||
create mode 100644 libavutil/arm/rpi_sand_neon.S
|
||||
create mode 100644 libavutil/rpi_sand_fn_pw.h
|
||||
create mode 100644 libavutil/rpi_sand_fns.c
|
||||
create mode 100644 libavutil/rpi_sand_fns.h
|
||||
create mode 100644 pi-util/BUILD.txt
|
||||
create mode 100644 pi-util/conf_h265.2016.csv
|
||||
create mode 100644 pi-util/conf_h265.2016_HEVC_v1.csv
|
||||
create mode 100644 pi-util/conf_h265.csv
|
||||
create mode 100755 pi-util/conf_pi1.sh
|
||||
create mode 100755 pi-util/conf_pi2.sh
|
||||
create mode 100755 pi-util/ffconf.py
|
||||
create mode 100755 pi-util/ffperf.py
|
||||
create mode 100755 pi-util/make_array.py
|
||||
create mode 100644 pi-util/perfcmp.py
|
||||
create mode 100755 pi-util/qem.sh
|
||||
create mode 100755 pi-util/v3dusage.py
|
||||
|
||||
diff --git a/.gitignore b/.gitignore
|
||||
index 0e57cb0b4c..b2e3374fea 100644
|
||||
index 2450ee8fc5..4bcc3ae643 100644
|
||||
--- a/.gitignore
|
||||
+++ b/.gitignore
|
||||
@@ -1,6 +1,7 @@
|
||||
@ -19,10 +206,10 @@ index 0e57cb0b4c..b2e3374fea 100644
|
||||
/ffplay
|
||||
/ffprobe
|
||||
diff --git a/configure b/configure
|
||||
index 827abfe694..28f630068e 100755
|
||||
index 34c2adb4a4..531c7e754f 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -318,6 +318,7 @@ External library support:
|
||||
@@ -331,6 +331,7 @@ External library support:
|
||||
--enable-libmfx enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no]
|
||||
--enable-libnpp enable Nvidia Performance Primitives-based code [no]
|
||||
--enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no]
|
||||
@ -30,7 +217,7 @@ index 827abfe694..28f630068e 100755
|
||||
--disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect]
|
||||
--disable-nvenc disable Nvidia video encoding code [autodetect]
|
||||
--enable-omx enable OpenMAX IL code [no]
|
||||
@@ -1776,6 +1777,7 @@ FEATURE_LIST="
|
||||
@@ -1866,6 +1867,7 @@ FEATURE_LIST="
|
||||
gray
|
||||
hardcoded_tables
|
||||
omx_rpi
|
||||
@ -38,15 +225,15 @@ index 827abfe694..28f630068e 100755
|
||||
runtime_cpudetect
|
||||
safe_bitstream_reader
|
||||
shared
|
||||
@@ -2293,6 +2295,7 @@ CONFIG_EXTRA="
|
||||
@@ -2390,6 +2392,7 @@ CONFIG_EXTRA="
|
||||
rtpdec
|
||||
rtpenc_chain
|
||||
rv34dsp
|
||||
+ sand
|
||||
scene_sad
|
||||
sinewin
|
||||
snappy
|
||||
srtp
|
||||
@@ -2610,6 +2613,8 @@ hap_decoder_select="snappy texturedsp"
|
||||
@@ -2715,6 +2718,8 @@ hap_decoder_select="snappy texturedsp"
|
||||
hap_encoder_deps="libsnappy"
|
||||
hap_encoder_select="texturedspenc"
|
||||
hevc_decoder_select="bswapdsp cabac golomb hevcparse videodsp"
|
||||
@ -54,18 +241,18 @@ index 827abfe694..28f630068e 100755
|
||||
+hevc_rpi_decoder_select="hevc_decoder sand"
|
||||
huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
|
||||
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"
|
||||
iac_decoder_select="imc_decoder"
|
||||
@@ -3393,6 +3398,8 @@ tinterlace_filter_deps="gpl"
|
||||
tinterlace_merge_test_deps="tinterlace_filter"
|
||||
tinterlace_pad_test_deps="tinterlace_filter"
|
||||
tonemap_filter_deps="const_nan"
|
||||
hymt_decoder_select="huffyuv_decoder"
|
||||
@@ -3543,6 +3548,8 @@ tonemap_filter_deps="const_nan"
|
||||
tonemap_opencl_filter_deps="opencl const_nan"
|
||||
transpose_opencl_filter_deps="opencl"
|
||||
transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags"
|
||||
+unsand_filter_deps="rpi"
|
||||
+unsand_filter_select="sand"
|
||||
unsharp_opencl_filter_deps="opencl"
|
||||
uspp_filter_deps="gpl avcodec"
|
||||
vaguedenoiser_filter_deps="gpl"
|
||||
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
|
||||
index c0214c42d8..faaea5772a 100644
|
||||
index 01f04103cf..80dc56d0c6 100644
|
||||
--- a/fftools/ffmpeg.c
|
||||
+++ b/fftools/ffmpeg.c
|
||||
@@ -24,6 +24,12 @@
|
||||
@ -107,7 +294,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
#if HAVE_SYS_RESOURCE_H
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
@@ -162,6 +187,241 @@ static int restore_tty;
|
||||
@@ -168,6 +193,241 @@ static int restore_tty;
|
||||
static void free_input_threads(void);
|
||||
#endif
|
||||
|
||||
@ -349,7 +536,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
/* sub2video hack:
|
||||
Convert subtitles to video with alpha to insert them in filter graphs.
|
||||
This is a temporary solution until libavfilter gets real subtitles support.
|
||||
@@ -583,6 +843,11 @@ static void ffmpeg_cleanup(int ret)
|
||||
@@ -589,6 +849,11 @@ static void ffmpeg_cleanup(int ret)
|
||||
avformat_close_input(&input_files[i]->ctx);
|
||||
av_freep(&input_files[i]);
|
||||
}
|
||||
@ -361,7 +548,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
for (i = 0; i < nb_input_streams; i++) {
|
||||
InputStream *ist = input_streams[i];
|
||||
|
||||
@@ -594,7 +859,9 @@ static void ffmpeg_cleanup(int ret)
|
||||
@@ -600,7 +865,9 @@ static void ffmpeg_cleanup(int ret)
|
||||
av_freep(&ist->filters);
|
||||
av_freep(&ist->hwaccel_device);
|
||||
av_freep(&ist->dts_buffer);
|
||||
@ -372,7 +559,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
avcodec_free_context(&ist->dec_ctx);
|
||||
|
||||
av_freep(&input_streams[i]);
|
||||
@@ -625,6 +892,7 @@ static void ffmpeg_cleanup(int ret)
|
||||
@@ -631,6 +898,7 @@ static void ffmpeg_cleanup(int ret)
|
||||
}
|
||||
term_exit();
|
||||
ffmpeg_exited = 1;
|
||||
@ -380,7 +567,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
}
|
||||
|
||||
void remove_avoptions(AVDictionary **a, AVDictionary *b)
|
||||
@@ -1060,6 +1328,17 @@ static void do_video_out(OutputFile *of,
|
||||
@@ -1070,6 +1338,17 @@ static void do_video_out(OutputFile *of,
|
||||
if (ost->source_index >= 0)
|
||||
ist = input_streams[ost->source_index];
|
||||
|
||||
@ -398,7 +585,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
frame_rate = av_buffersink_get_frame_rate(filter);
|
||||
if (frame_rate.num > 0 && frame_rate.den > 0)
|
||||
duration = 1/(av_q2d(frame_rate) * av_q2d(enc->time_base));
|
||||
@@ -2132,8 +2411,8 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame)
|
||||
@@ -2141,8 +2420,8 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame)
|
||||
ifilter->channel_layout != frame->channel_layout;
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
@ -409,7 +596,7 @@ index c0214c42d8..faaea5772a 100644
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2891,6 +3170,12 @@ static int init_input_stream(int ist_index, char *error, int error_len)
|
||||
@@ -2906,6 +3185,12 @@ static int init_input_stream(int ist_index, char *error, int error_len)
|
||||
ist->dec_ctx->opaque = ist;
|
||||
ist->dec_ctx->get_format = get_format;
|
||||
ist->dec_ctx->get_buffer2 = get_buffer;
|
||||
@ -423,10 +610,10 @@ index c0214c42d8..faaea5772a 100644
|
||||
|
||||
av_opt_set_int(ist->dec_ctx, "refcounted_frames", 1, 0);
|
||||
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
|
||||
index 877fd670e6..1efd3a43a8 100644
|
||||
index 72838de1e2..6922cedc5d 100644
|
||||
--- a/fftools/ffmpeg_filter.c
|
||||
+++ b/fftools/ffmpeg_filter.c
|
||||
@@ -1179,8 +1179,8 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
|
||||
@@ -1188,8 +1188,8 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
|
||||
|
||||
ifilter->format = frame->format;
|
||||
|
||||
@ -438,10 +625,10 @@ index 877fd670e6..1efd3a43a8 100644
|
||||
|
||||
ifilter->sample_rate = frame->sample_rate;
|
||||
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
|
||||
index d7a7eb0662..3949c9e76b 100644
|
||||
index f5ca18aa64..483bb86b54 100644
|
||||
--- a/fftools/ffmpeg_opt.c
|
||||
+++ b/fftools/ffmpeg_opt.c
|
||||
@@ -684,11 +684,19 @@ static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *
|
||||
@@ -698,11 +698,19 @@ static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *
|
||||
|
||||
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
|
||||
if (codec_name) {
|
||||
@ -462,7 +649,7 @@ index d7a7eb0662..3949c9e76b 100644
|
||||
|
||||
/* Add all the streams from the given input file to the global
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index 4b8ad121db..f6e6784e5a 100644
|
||||
index 3cd73fbcc6..aa15d411cd 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -6,6 +6,7 @@ HEADERS = ac3_parser.h \
|
||||
@ -473,7 +660,7 @@ index 4b8ad121db..f6e6784e5a 100644
|
||||
d3d11va.h \
|
||||
dirac.h \
|
||||
dv_profile.h \
|
||||
@@ -128,6 +129,7 @@ OBJS-$(CONFIG_QSVDEC) += qsvdec.o
|
||||
@@ -132,6 +133,7 @@ OBJS-$(CONFIG_QSVDEC) += qsvdec.o
|
||||
OBJS-$(CONFIG_QSVENC) += qsvenc.o
|
||||
OBJS-$(CONFIG_RANGECODER) += rangecoder.o
|
||||
OBJS-$(CONFIG_RDFT) += rdft.o
|
||||
@ -481,7 +668,7 @@ index 4b8ad121db..f6e6784e5a 100644
|
||||
OBJS-$(CONFIG_RV34DSP) += rv34dsp.o
|
||||
OBJS-$(CONFIG_SHARED) += log2_tab.o reverse.o
|
||||
OBJS-$(CONFIG_SINEWIN) += sinewin.o sinewin_fixed.o
|
||||
@@ -360,6 +362,13 @@ OBJS-$(CONFIG_HAP_ENCODER) += hapenc.o hap.o
|
||||
@@ -368,6 +370,13 @@ OBJS-$(CONFIG_HCOM_DECODER) += hcom.o
|
||||
OBJS-$(CONFIG_HEVC_DECODER) += hevcdec.o hevc_mvs.o \
|
||||
hevc_cabac.o hevc_refs.o hevcpred.o \
|
||||
hevcdsp.o hevc_filter.o hevc_data.o
|
||||
@ -495,7 +682,7 @@ index 4b8ad121db..f6e6784e5a 100644
|
||||
OBJS-$(CONFIG_HEVC_AMF_ENCODER) += amfenc_hevc.o
|
||||
OBJS-$(CONFIG_HEVC_CUVID_DECODER) += cuviddec.o
|
||||
OBJS-$(CONFIG_HEVC_MEDIACODEC_DECODER) += mediacodecdec.o
|
||||
@@ -1188,3 +1197,31 @@ $(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h
|
||||
@@ -1223,3 +1232,31 @@ $(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h
|
||||
$(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
|
||||
$(SUBDIR)sinewin_fixed.o: $(SUBDIR)sinewin_fixed_tables.h
|
||||
endif
|
||||
@ -528,10 +715,10 @@ index 4b8ad121db..f6e6784e5a 100644
|
||||
+$(SUBDIR)rpi_hevcdec.o $(SUBDIR)rpi_shader_template.o $(SUBDIR)rpi_qpu.o: $(SUBDIR)rpi_hevc_shader.h
|
||||
+endif
|
||||
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
|
||||
index 4d4ef530e4..fba8776c9f 100644
|
||||
index d2f9a39ce5..cc87600a2a 100644
|
||||
--- a/libavcodec/allcodecs.c
|
||||
+++ b/libavcodec/allcodecs.c
|
||||
@@ -142,6 +142,7 @@ extern AVCodec ff_h264_qsv_decoder;
|
||||
@@ -145,6 +145,7 @@ extern AVCodec ff_h264_qsv_decoder;
|
||||
extern AVCodec ff_h264_rkmpp_decoder;
|
||||
extern AVCodec ff_hap_encoder;
|
||||
extern AVCodec ff_hap_decoder;
|
||||
@ -539,7 +726,7 @@ index 4d4ef530e4..fba8776c9f 100644
|
||||
extern AVCodec ff_hevc_decoder;
|
||||
extern AVCodec ff_hevc_qsv_decoder;
|
||||
extern AVCodec ff_hevc_rkmpp_decoder;
|
||||
@@ -833,6 +834,41 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
|
||||
@@ -861,6 +862,41 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
|
||||
}
|
||||
}
|
||||
|
||||
@ -15183,10 +15370,10 @@ index 0000000000..e35896a102
|
||||
+
|
||||
+endfunc
|
||||
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
|
||||
index fb0c6fae70..9f2ebb16f3 100644
|
||||
index d234271c5b..a36b675fba 100644
|
||||
--- a/libavcodec/avcodec.h
|
||||
+++ b/libavcodec/avcodec.h
|
||||
@@ -3208,7 +3208,13 @@ typedef struct AVCodecContext {
|
||||
@@ -3273,7 +3273,13 @@ typedef struct AVCodecContext {
|
||||
#endif
|
||||
|
||||
/**
|
||||
@ -15201,7 +15388,7 @@ index fb0c6fae70..9f2ebb16f3 100644
|
||||
* the end of the audio. I.e. this number of decoded samples must be
|
||||
* discarded by the caller from the end of the stream to get the original
|
||||
* audio without any trailing padding.
|
||||
@@ -4593,6 +4599,17 @@ void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
|
||||
@@ -4666,6 +4672,17 @@ void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
|
||||
*/
|
||||
AVCodec *avcodec_find_decoder(enum AVCodecID id);
|
||||
|
||||
@ -15262,10 +15449,10 @@ index 647a22ef7c..4ed35d1126 100644
|
||||
|
||||
#include "avcodec.h"
|
||||
diff --git a/libavcodec/raw.c b/libavcodec/raw.c
|
||||
index 8da2a9735e..9089f9b4ea 100644
|
||||
index b6fb91c1c6..e99dacbb1c 100644
|
||||
--- a/libavcodec/raw.c
|
||||
+++ b/libavcodec/raw.c
|
||||
@@ -283,6 +283,10 @@ const PixelFormatTag ff_raw_pix_fmt_tags[] = {
|
||||
@@ -289,6 +289,10 @@ const PixelFormatTag ff_raw_pix_fmt_tags[] = {
|
||||
{ AV_PIX_FMT_YUV444P16LE, MKTAG('I', '4', 'F', 'L') },
|
||||
{ AV_PIX_FMT_YUV444P16BE, MKTAG('I', '4', 'F', 'B') },
|
||||
|
||||
@ -19729,7 +19916,7 @@ index 0000000000..221755fb6e
|
||||
+
|
||||
diff --git a/libavcodec/rpi_hevc_parse.c b/libavcodec/rpi_hevc_parse.c
|
||||
new file mode 100644
|
||||
index 0000000000..04f9231acc
|
||||
index 0000000000..36affa9afa
|
||||
--- /dev/null
|
||||
+++ b/libavcodec/rpi_hevc_parse.c
|
||||
@@ -0,0 +1,142 @@
|
||||
@ -19764,7 +19951,7 @@ index 0000000000..04f9231acc
|
||||
+ int ret = 0;
|
||||
+ H2645Packet pkt = { 0 };
|
||||
+
|
||||
+ ret = ff_h2645_packet_split(&pkt, buf, buf_size, logctx, is_nalff, nal_length_size, AV_CODEC_ID_HEVC, 1);
|
||||
+ ret = ff_h2645_packet_split(&pkt, buf, buf_size, logctx, is_nalff, nal_length_size, AV_CODEC_ID_HEVC, 1, 0);
|
||||
+ if (ret < 0) {
|
||||
+ goto done;
|
||||
+ }
|
||||
@ -28119,7 +28306,7 @@ index 0000000000..1128a2c054
|
||||
+};
|
||||
diff --git a/libavcodec/rpi_hevcdec.c b/libavcodec/rpi_hevcdec.c
|
||||
new file mode 100644
|
||||
index 0000000000..39a63c77de
|
||||
index 0000000000..c874222ebb
|
||||
--- /dev/null
|
||||
+++ b/libavcodec/rpi_hevcdec.c
|
||||
@@ -0,0 +1,6016 @@
|
||||
@ -33552,7 +33739,7 @@ index 0000000000..39a63c77de
|
||||
+ /* split the input packet into NAL units, so we know the upper bound on the
|
||||
+ * number of slices in the frame */
|
||||
+ ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
|
||||
+ s->nal_length_size, s->avctx->codec_id, 0);
|
||||
+ s->nal_length_size, s->avctx->codec_id, 0, 0);
|
||||
+ if (ret < 0) {
|
||||
+ av_log(s->avctx, AV_LOG_ERROR,
|
||||
+ "Error splitting the input into NAL units.\n");
|
||||
@ -42213,11 +42400,11 @@ index 0000000000..26fb3be999
|
||||
+#endif
|
||||
+
|
||||
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
|
||||
index bcd5d437ff..ccb49ec8c0 100644
|
||||
index 455c809b15..087cab98ee 100644
|
||||
--- a/libavfilter/Makefile
|
||||
+++ b/libavfilter/Makefile
|
||||
@@ -346,6 +346,7 @@ OBJS-$(CONFIG_TONEMAP_FILTER) += vf_tonemap.o
|
||||
OBJS-$(CONFIG_TRANSPOSE_FILTER) += vf_transpose.o
|
||||
@@ -406,6 +406,7 @@ OBJS-$(CONFIG_TRANSPOSE_OPENCL_FILTER) += vf_transpose_opencl.o opencl.o o
|
||||
OBJS-$(CONFIG_TRANSPOSE_VAAPI_FILTER) += vf_transpose_vaapi.o vaapi_vpp.o
|
||||
OBJS-$(CONFIG_TRIM_FILTER) += trim.o
|
||||
OBJS-$(CONFIG_UNPREMULTIPLY_FILTER) += vf_premultiply.o framesync.o
|
||||
+OBJS-$(CONFIG_UNSAND_FILTER) += vf_unsand.o
|
||||
@ -42225,10 +42412,10 @@ index bcd5d437ff..ccb49ec8c0 100644
|
||||
OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER) += vf_unsharp_opencl.o opencl.o \
|
||||
opencl/unsharp.o
|
||||
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
|
||||
index 68b2992027..3b059fce4e 100644
|
||||
index 04a3df7d56..8d1470dd34 100644
|
||||
--- a/libavfilter/allfilters.c
|
||||
+++ b/libavfilter/allfilters.c
|
||||
@@ -338,6 +338,7 @@ extern AVFilter ff_vf_transpose;
|
||||
@@ -387,6 +387,7 @@ extern AVFilter ff_vf_transpose_vaapi;
|
||||
extern AVFilter ff_vf_trim;
|
||||
extern AVFilter ff_vf_unpremultiply;
|
||||
extern AVFilter ff_vf_unsharp;
|
||||
@ -42237,7 +42424,7 @@ index 68b2992027..3b059fce4e 100644
|
||||
extern AVFilter ff_vf_uspp;
|
||||
extern AVFilter ff_vf_vaguedenoiser;
|
||||
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
|
||||
index 4cc6892404..9db92322a4 100644
|
||||
index a149f8fb6d..776e3bb9ab 100644
|
||||
--- a/libavfilter/avfiltergraph.c
|
||||
+++ b/libavfilter/avfiltergraph.c
|
||||
@@ -32,6 +32,9 @@
|
||||
@ -42375,18 +42562,18 @@ index 4cc6892404..9db92322a4 100644
|
||||
(!ff_merge_samplerates(inlink->in_samplerates,
|
||||
inlink->out_samplerates) ||
|
||||
diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
|
||||
index cd56f8ca45..813a682aa1 100644
|
||||
index e0ff7e4dd8..77bc3d83fe 100644
|
||||
--- a/libavfilter/buffersrc.c
|
||||
+++ b/libavfilter/buffersrc.c
|
||||
@@ -207,7 +207,7 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
@@ -213,7 +213,7 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
|
||||
switch (ctx->outputs[0]->type) {
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
- CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
|
||||
+ CHECK_VIDEO_PARAM_CHANGE(ctx, s, av_frame_cropped_width(frame), av_frame_cropped_height(frame),
|
||||
frame->format);
|
||||
break;
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
switch (ctx->outputs[0]->type) {
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
- CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
|
||||
+ CHECK_VIDEO_PARAM_CHANGE(ctx, s, av_frame_cropped_width(frame), av_frame_cropped_height(frame),
|
||||
frame->format, frame->pts);
|
||||
break;
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
diff --git a/libavfilter/vf_unsand.c b/libavfilter/vf_unsand.c
|
||||
new file mode 100644
|
||||
index 0000000000..64578b7ac4
|
||||
@ -42626,10 +42813,10 @@ index 0000000000..64578b7ac4
|
||||
+};
|
||||
+
|
||||
diff --git a/libavformat/utils.c b/libavformat/utils.c
|
||||
index c25eab4d49..4db44315c7 100644
|
||||
index 6c6f4e1bd1..c6332d3e46 100644
|
||||
--- a/libavformat/utils.c
|
||||
+++ b/libavformat/utils.c
|
||||
@@ -3005,6 +3005,40 @@ static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
|
||||
@@ -3013,6 +3013,40 @@ static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -42670,7 +42857,7 @@ index c25eab4d49..4db44315c7 100644
|
||||
/* returns 1 or 0 if or if not decoded data was returned, or a negative error */
|
||||
static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
|
||||
AVDictionary **options)
|
||||
@@ -3039,7 +3073,11 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
|
||||
@@ -3047,7 +3081,11 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
|
||||
av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
|
||||
if (s->codec_whitelist)
|
||||
av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
|
||||
@ -42683,7 +42870,7 @@ index c25eab4d49..4db44315c7 100644
|
||||
if (!options)
|
||||
av_dict_free(&thread_opt);
|
||||
if (ret < 0) {
|
||||
@@ -3070,6 +3108,14 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
|
||||
@@ -3078,6 +3116,14 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
|
||||
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
ret = avcodec_send_packet(avctx, &pkt);
|
||||
@ -42698,7 +42885,7 @@ index c25eab4d49..4db44315c7 100644
|
||||
if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
|
||||
break;
|
||||
if (ret >= 0)
|
||||
@@ -3663,9 +3709,20 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
@@ -3671,9 +3717,20 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
// Try to just open decoders, in case this is enough to get parameters.
|
||||
if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
|
||||
if (codec && !avctx->codec)
|
||||
@ -42723,13 +42910,13 @@ index c25eab4d49..4db44315c7 100644
|
||||
if (!options)
|
||||
av_dict_free(&thread_opt);
|
||||
diff --git a/libavutil/Makefile b/libavutil/Makefile
|
||||
index a63ba523c9..4f9a19e800 100644
|
||||
index 8a7a44e4b5..6bfc885796 100644
|
||||
--- a/libavutil/Makefile
|
||||
+++ b/libavutil/Makefile
|
||||
@@ -164,6 +164,7 @@ OBJS-$(CONFIG_QSV) += hwcontext_qsv.o
|
||||
OBJS-$(CONFIG_LIBDRM) += hwcontext_drm.o
|
||||
OBJS-$(CONFIG_LZO) += lzo.o
|
||||
@@ -170,6 +170,7 @@ OBJS-$(CONFIG_LZO) += lzo.o
|
||||
OBJS-$(CONFIG_MEDIACODEC) += hwcontext_mediacodec.o
|
||||
OBJS-$(CONFIG_OPENCL) += hwcontext_opencl.o
|
||||
OBJS-$(CONFIG_QSV) += hwcontext_qsv.o
|
||||
+OBJS-$(CONFIG_SAND) += rpi_sand_fns.o
|
||||
OBJS-$(CONFIG_VAAPI) += hwcontext_vaapi.o
|
||||
OBJS-$(CONFIG_VIDEOTOOLBOX) += hwcontext_videotoolbox.o
|
||||
@ -42818,7 +43005,7 @@ index 73b6bd0b14..d907de3f1c 100644
|
||||
* @}
|
||||
*/
|
||||
diff --git a/libavutil/frame.c b/libavutil/frame.c
|
||||
index 00215ac29a..d068f437e7 100644
|
||||
index dcf1fc3d17..dd0876f5a9 100644
|
||||
--- a/libavutil/frame.c
|
||||
+++ b/libavutil/frame.c
|
||||
@@ -16,6 +16,8 @@
|
||||
@ -42840,7 +43027,7 @@ index 00215ac29a..d068f437e7 100644
|
||||
|
||||
#if FF_API_FRAME_GET_SET
|
||||
MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp)
|
||||
@@ -885,6 +890,12 @@ int av_frame_apply_cropping(AVFrame *frame, int flags)
|
||||
@@ -893,6 +898,12 @@ int av_frame_apply_cropping(AVFrame *frame, int flags)
|
||||
(frame->crop_top + frame->crop_bottom) >= frame->height)
|
||||
return AVERROR(ERANGE);
|
||||
|
||||
@ -42854,10 +43041,10 @@ index 00215ac29a..d068f437e7 100644
|
||||
if (!desc)
|
||||
return AVERROR_BUG;
|
||||
diff --git a/libavutil/frame.h b/libavutil/frame.h
|
||||
index 9d57d6ce66..1ade7bd707 100644
|
||||
index 5d3231e7bb..e250f420a2 100644
|
||||
--- a/libavutil/frame.h
|
||||
+++ b/libavutil/frame.h
|
||||
@@ -886,6 +886,16 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
|
||||
@@ -964,6 +964,16 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
|
||||
*/
|
||||
const char *av_frame_side_data_name(enum AVFrameSideDataType type);
|
||||
|
||||
@ -42875,12 +43062,12 @@ index 9d57d6ce66..1ade7bd707 100644
|
||||
* @}
|
||||
*/
|
||||
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
|
||||
index 8ed52751c1..71d6dd4250 100644
|
||||
index b97b0665b0..e3f21b1137 100644
|
||||
--- a/libavutil/pixdesc.c
|
||||
+++ b/libavutil/pixdesc.c
|
||||
@@ -2185,6 +2185,30 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
|
||||
.name = "opencl",
|
||||
.flags = AV_PIX_FMT_FLAG_HWACCEL,
|
||||
@@ -2344,6 +2344,30 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
|
||||
},
|
||||
.flags = AV_PIX_FMT_FLAG_PLANAR,
|
||||
},
|
||||
+ [AV_PIX_FMT_SAND128] = {
|
||||
+ .name = "sand128",
|
||||
@ -42910,21 +43097,20 @@ index 8ed52751c1..71d6dd4250 100644
|
||||
#if FF_API_PLUS1_MINUS1
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
|
||||
index e184a56672..1078c192a6 100644
|
||||
index 8b54c9415b..9f74f7b335 100644
|
||||
--- a/libavutil/pixfmt.h
|
||||
+++ b/libavutil/pixfmt.h
|
||||
@@ -330,6 +330,11 @@ enum AVPixelFormat {
|
||||
*/
|
||||
AV_PIX_FMT_OPENCL,
|
||||
@@ -347,6 +347,10 @@ enum AVPixelFormat {
|
||||
|
||||
AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
|
||||
AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped
|
||||
+ // RPI - not on ifdef so can be got at by calling progs
|
||||
+ AV_PIX_FMT_SAND128, ///< 4:2:0 8-bit 128x*Y stripe, 64x*UV stripe, then next x stripe, mysterious padding
|
||||
+ AV_PIX_FMT_SAND64_10, ///< 4:2:0 10-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding
|
||||
+ AV_PIX_FMT_SAND64_16, ///< 4:2:0 16-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding
|
||||
+
|
||||
|
||||
AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
|
||||
};
|
||||
|
||||
diff --git a/libavutil/rpi_sand_fn_pw.h b/libavutil/rpi_sand_fn_pw.h
|
||||
new file mode 100644
|
||||
index 0000000000..52d52a2a83
|
||||
@ -43445,7 +43631,7 @@ index 0000000000..b1e99a6a89
|
||||
+
|
||||
diff --git a/pi-util/conf_h265.2016.csv b/pi-util/conf_h265.2016.csv
|
||||
new file mode 100644
|
||||
index 0000000000..3e90f6893f
|
||||
index 0000000000..17fb09be58
|
||||
--- /dev/null
|
||||
+++ b/pi-util/conf_h265.2016.csv
|
||||
@@ -0,0 +1,195 @@
|
||||
@ -43646,7 +43832,7 @@ index 0000000000..3e90f6893f
|
||||
+1,local/intra_pred_21_laps,intra_pred_21_laps.265,intra_pred_21_laps.md5
|
||||
diff --git a/pi-util/conf_h265.2016_HEVC_v1.csv b/pi-util/conf_h265.2016_HEVC_v1.csv
|
||||
new file mode 100644
|
||||
index 0000000000..6082641271
|
||||
index 0000000000..b482907fcb
|
||||
--- /dev/null
|
||||
+++ b/pi-util/conf_h265.2016_HEVC_v1.csv
|
||||
@@ -0,0 +1,147 @@
|
||||
@ -43799,7 +43985,7 @@ index 0000000000..6082641271
|
||||
+1,WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5
|
||||
diff --git a/pi-util/conf_h265.csv b/pi-util/conf_h265.csv
|
||||
new file mode 100644
|
||||
index 0000000000..fc14f2a3c2
|
||||
index 0000000000..113528cfb0
|
||||
--- /dev/null
|
||||
+++ b/pi-util/conf_h265.csv
|
||||
@@ -0,0 +1,144 @@
|
||||
@ -44618,3 +44804,6 @@ index 0000000000..5935a11ca5
|
||||
+
|
||||
+ do_logparse(args.logfile)
|
||||
+
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From e6cec3f54693e7e2c10b6b7bc8f72daa6e9a77dc Mon Sep 17 00:00:00 2001
|
||||
From 3710124dd57ede7588884ecc86cbcaee5d530498 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Mon, 3 Dec 2018 23:48:04 +0100
|
||||
Subject: [PATCH 01/12] avutil: add av_buffer_pool_flush()
|
||||
@ -49,6 +49,3 @@ index 73b6bd0b14..0678fa4bea 100644
|
||||
/**
|
||||
* Mark the pool as being available for freeing. It will actually be freed only
|
||||
* once all the allocated buffers associated with the pool are released. Thus it
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 457a74f059e5467f7f24f15be1b0e87a34e8cabc Mon Sep 17 00:00:00 2001
|
||||
From ca0440a82038ebe56c467d89787291f55535d03d Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 15 Dec 2018 22:32:16 +0100
|
||||
Subject: [PATCH 02/12] Add common V4L2 request API code
|
||||
@ -15,18 +15,18 @@ Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
create mode 100644 libavcodec/v4l2_request.h
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 15e6c321b1..7f9e7e7b25 100755
|
||||
index 34c2adb4a4..6b41344dfd 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -264,6 +264,7 @@ External library support:
|
||||
@@ -271,6 +271,7 @@ External library support:
|
||||
--enable-libtls enable LibreSSL (via libtls), needed for https support
|
||||
if openssl or gnutls is not used [no]
|
||||
if openssl, gnutls or mbedtls is not used [no]
|
||||
--enable-libtwolame enable MP2 encoding via libtwolame [no]
|
||||
+ --enable-libudev enable libudev [no]
|
||||
--enable-libv4l2 enable libv4l2/v4l-utils [no]
|
||||
--enable-libvidstab enable video stabilization using vid.stab [no]
|
||||
--enable-libvmaf enable vmaf filter via libvmaf [no]
|
||||
@@ -324,6 +325,7 @@ External library support:
|
||||
@@ -337,6 +338,7 @@ External library support:
|
||||
--enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no]
|
||||
--enable-rkmpp enable Rockchip Media Process Platform code [no]
|
||||
--disable-v4l2-m2m disable V4L2 mem2mem code [autodetect]
|
||||
@ -34,7 +34,7 @@ index 15e6c321b1..7f9e7e7b25 100755
|
||||
--disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect]
|
||||
--disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
|
||||
--disable-videotoolbox disable VideoToolbox code [autodetect]
|
||||
@@ -1732,6 +1734,7 @@ EXTERNAL_LIBRARY_LIST="
|
||||
@@ -1797,6 +1799,7 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libtesseract
|
||||
libtheora
|
||||
libtwolame
|
||||
@ -42,7 +42,7 @@ index 15e6c321b1..7f9e7e7b25 100755
|
||||
libv4l2
|
||||
libvorbis
|
||||
libvpx
|
||||
@@ -1782,6 +1785,7 @@ HWACCEL_LIBRARY_LIST="
|
||||
@@ -1851,6 +1854,7 @@ HWACCEL_LIBRARY_LIST="
|
||||
mmal
|
||||
omx
|
||||
opencl
|
||||
@ -50,23 +50,23 @@ index 15e6c321b1..7f9e7e7b25 100755
|
||||
"
|
||||
|
||||
DOCUMENT_LIST="
|
||||
@@ -2783,6 +2787,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext"
|
||||
@@ -2873,6 +2877,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext"
|
||||
dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32"
|
||||
ffnvcodec_deps_any="libdl LoadLibrary"
|
||||
nvdec_deps="ffnvcodec"
|
||||
+v4l2_request_deps="linux_videodev2_h linux_media_h v4l2_timeval_to_ns libdrm libudev"
|
||||
vaapi_x11_deps="xlib"
|
||||
videotoolbox_hwaccel_deps="videotoolbox pthreads"
|
||||
videotoolbox_hwaccel_extralibs="-framework QuartzCore"
|
||||
xvmc_deps="X11_extensions_XvMClib_h"
|
||||
@@ -6063,6 +6068,7 @@ enabled libtls && require_pkg_config libtls libtls tls.h tls_configur
|
||||
@@ -6270,6 +6275,7 @@ enabled libtls && require_pkg_config libtls libtls tls.h tls_configur
|
||||
enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame &&
|
||||
{ check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
|
||||
die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
|
||||
+enabled libudev && require_pkg_config libudev libudev libudev.h udev_new
|
||||
enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl
|
||||
enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
|
||||
enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 0.6.2" libvmaf.h compute_vmaf
|
||||
@@ -6153,6 +6159,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r
|
||||
enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 1.3.9" libvmaf.h compute_vmaf
|
||||
@@ -6365,6 +6371,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r
|
||||
{ enabled libdrm ||
|
||||
die "ERROR: rkmpp requires --enable-libdrm"; }
|
||||
}
|
||||
@ -74,23 +74,23 @@ index 15e6c321b1..7f9e7e7b25 100755
|
||||
+ die "ERROR: v4l2-request requires --enable-libdrm"; } &&
|
||||
+ { enabled libudev ||
|
||||
+ die "ERROR: v4l2-request requires --enable-libudev"; }
|
||||
enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init
|
||||
|
||||
if enabled gcrypt; then
|
||||
GCRYPT_CONFIG="${cross_prefix}libgcrypt-config"
|
||||
@@ -6230,6 +6240,8 @@ check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
|
||||
|
||||
@@ -6444,6 +6454,8 @@ check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
|
||||
check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
|
||||
check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
|
||||
|
||||
+check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
+
|
||||
check_header sys/videoio.h
|
||||
check_headers sys/videoio.h
|
||||
test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
|
||||
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index 4b8ad121db..48f6e06545 100644
|
||||
index 3cd73fbcc6..9e847eeadc 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -143,6 +143,7 @@ OBJS-$(CONFIG_VP3DSP) += vp3dsp.o
|
||||
@@ -147,6 +147,7 @@ OBJS-$(CONFIG_VP3DSP) += vp3dsp.o
|
||||
OBJS-$(CONFIG_VP56DSP) += vp56dsp.o
|
||||
OBJS-$(CONFIG_VP8DSP) += vp8dsp.o
|
||||
OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o
|
||||
@ -1137,6 +1137,3 @@ index 0000000000..d4146bd4ee
|
||||
+int ff_v4l2_request_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx);
|
||||
+
|
||||
+#endif /* AVCODEC_V4L2_REQUEST_H */
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From d46c4def125a142419db249051fbaa8e743e3e53 Mon Sep 17 00:00:00 2001
|
||||
From 279092b1ef7cb944c513167dd55861ff2f2bb473 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 15 Dec 2018 22:32:16 +0100
|
||||
Subject: [PATCH 03/12] Add V4L2 request API mpeg2 hwaccel
|
||||
@ -14,10 +14,10 @@ Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
create mode 100644 libavcodec/v4l2_request_mpeg2.c
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 7f9e7e7b25..6088e8d00c 100755
|
||||
index 6b41344dfd..e88c201cce 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2846,6 +2846,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2"
|
||||
@@ -2937,6 +2937,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2"
|
||||
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
|
||||
mpeg2_nvdec_hwaccel_deps="nvdec"
|
||||
mpeg2_nvdec_hwaccel_select="mpeg2video_decoder"
|
||||
@ -26,19 +26,19 @@ index 7f9e7e7b25..6088e8d00c 100755
|
||||
mpeg2_vaapi_hwaccel_deps="vaapi"
|
||||
mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
|
||||
mpeg2_vdpau_hwaccel_deps="vdpau"
|
||||
@@ -6241,6 +6243,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
|
||||
@@ -6455,6 +6457,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
|
||||
check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
|
||||
|
||||
check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
+check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;"
|
||||
|
||||
check_header sys/videoio.h
|
||||
check_headers sys/videoio.h
|
||||
test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index 48f6e06545..9b945e3f64 100644
|
||||
index 9e847eeadc..864f24a2af 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -871,6 +871,7 @@ OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
|
||||
@@ -891,6 +891,7 @@ OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
|
||||
OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
|
||||
OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
|
||||
OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec_other.o
|
||||
@ -242,6 +242,3 @@ index 0000000000..782b9c2471
|
||||
+ .frame_params = ff_v4l2_request_frame_params,
|
||||
+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
|
||||
+};
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From fb59440a268d956bffa40604e4422420453b4605 Mon Sep 17 00:00:00 2001
|
||||
From da483a0eb4802714d9ad3a07ea17c2ec0f65c2a5 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 15 Dec 2018 22:32:16 +0100
|
||||
Subject: [PATCH 04/12] Add V4L2 request API h264 hwaccel
|
||||
@ -16,10 +16,10 @@ Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
create mode 100644 libavcodec/v4l2_request_h264.c
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 6088e8d00c..a967ae0afb 100755
|
||||
index e88c201cce..576a79ff09 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2804,6 +2804,8 @@ h264_dxva2_hwaccel_deps="dxva2"
|
||||
@@ -2895,6 +2895,8 @@ h264_dxva2_hwaccel_deps="dxva2"
|
||||
h264_dxva2_hwaccel_select="h264_decoder"
|
||||
h264_nvdec_hwaccel_deps="nvdec"
|
||||
h264_nvdec_hwaccel_select="h264_decoder"
|
||||
@ -28,19 +28,19 @@ index 6088e8d00c..a967ae0afb 100755
|
||||
h264_vaapi_hwaccel_deps="vaapi"
|
||||
h264_vaapi_hwaccel_select="h264_decoder"
|
||||
h264_vdpau_hwaccel_deps="vdpau"
|
||||
@@ -6243,6 +6245,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
|
||||
@@ -6457,6 +6459,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
|
||||
check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
|
||||
|
||||
check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
+check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;"
|
||||
check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;"
|
||||
|
||||
check_header sys/videoio.h
|
||||
check_headers sys/videoio.h
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index 9b945e3f64..2bdfaabb5f 100644
|
||||
index 864f24a2af..58bd444934 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -852,6 +852,7 @@ OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o
|
||||
@@ -872,6 +872,7 @@ OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o
|
||||
OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o
|
||||
OBJS-$(CONFIG_H264_NVDEC_HWACCEL) += nvdec_h264.o
|
||||
OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec_h2645.o
|
||||
@ -49,10 +49,10 @@ index 9b945e3f64..2bdfaabb5f 100644
|
||||
OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o
|
||||
OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
|
||||
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
|
||||
index af9ec9789b..f1e11003af 100644
|
||||
index fc4e65bf01..9912ede703 100644
|
||||
--- a/libavcodec/h264_slice.c
|
||||
+++ b/libavcodec/h264_slice.c
|
||||
@@ -758,6 +758,7 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
|
||||
@@ -765,6 +765,7 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
|
||||
#define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \
|
||||
(CONFIG_H264_D3D11VA_HWACCEL * 2) + \
|
||||
CONFIG_H264_NVDEC_HWACCEL + \
|
||||
@ -60,7 +60,7 @@ index af9ec9789b..f1e11003af 100644
|
||||
CONFIG_H264_VAAPI_HWACCEL + \
|
||||
CONFIG_H264_VIDEOTOOLBOX_HWACCEL + \
|
||||
CONFIG_H264_VDPAU_HWACCEL)
|
||||
@@ -842,6 +843,9 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
|
||||
@@ -849,6 +850,9 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
|
||||
#endif
|
||||
#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
|
||||
@ -71,10 +71,10 @@ index af9ec9789b..f1e11003af 100644
|
||||
if (h->avctx->codec->pix_fmts)
|
||||
choices = h->avctx->codec->pix_fmts;
|
||||
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
|
||||
index 33e1056d87..3ccfa60621 100644
|
||||
index 03c87b59bd..dbcceb915a 100644
|
||||
--- a/libavcodec/h264dec.c
|
||||
+++ b/libavcodec/h264dec.c
|
||||
@@ -1078,6 +1078,9 @@ AVCodec ff_h264_decoder = {
|
||||
@@ -1081,6 +1081,9 @@ AVCodec ff_h264_decoder = {
|
||||
#endif
|
||||
#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL
|
||||
HWACCEL_VIDEOTOOLBOX(h264),
|
||||
@ -545,6 +545,3 @@ index 0000000000..81b3c4b092
|
||||
+ .frame_params = ff_v4l2_request_frame_params,
|
||||
+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
|
||||
+};
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2511b50434e37a56af86bd38b76a6b5cf4d3117b Mon Sep 17 00:00:00 2001
|
||||
From 521d06aec85d55a28e946a222f591747a1d3f2f5 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 15 Dec 2018 22:32:16 +0100
|
||||
Subject: [PATCH 05/12] Add V4L2 request API hevc hwaccel
|
||||
@ -15,10 +15,10 @@ Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
create mode 100644 libavcodec/v4l2_request_hevc.c
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index a967ae0afb..d07cd27d88 100755
|
||||
index 576a79ff09..d51ee62a70 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2820,6 +2820,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
|
||||
@@ -2911,6 +2911,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
|
||||
hevc_dxva2_hwaccel_select="hevc_decoder"
|
||||
hevc_nvdec_hwaccel_deps="nvdec"
|
||||
hevc_nvdec_hwaccel_select="hevc_decoder"
|
||||
@ -27,19 +27,19 @@ index a967ae0afb..d07cd27d88 100755
|
||||
hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
|
||||
hevc_vaapi_hwaccel_select="hevc_decoder"
|
||||
hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC"
|
||||
@@ -6246,6 +6248,7 @@ check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
|
||||
@@ -6460,6 +6462,7 @@ check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
|
||||
|
||||
check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;"
|
||||
+check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;"
|
||||
check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;"
|
||||
|
||||
check_header sys/videoio.h
|
||||
check_headers sys/videoio.h
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index 2bdfaabb5f..a4c959e0f5 100644
|
||||
index 58bd444934..2b53d2b650 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -860,6 +860,7 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o
|
||||
@@ -880,6 +880,7 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o
|
||||
OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o
|
||||
OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o
|
||||
OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec_h2645.o
|
||||
@ -48,10 +48,10 @@ index 2bdfaabb5f..a4c959e0f5 100644
|
||||
OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o
|
||||
OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o
|
||||
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
|
||||
index 2c33a1ff57..d717850eeb 100644
|
||||
index 8f1c162ace..4c9c92bfc2 100644
|
||||
--- a/libavcodec/hevcdec.c
|
||||
+++ b/libavcodec/hevcdec.c
|
||||
@@ -362,6 +362,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
@@ -373,6 +373,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
|
||||
CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
|
||||
CONFIG_HEVC_NVDEC_HWACCEL + \
|
||||
@ -59,7 +59,7 @@ index 2c33a1ff57..d717850eeb 100644
|
||||
CONFIG_HEVC_VAAPI_HWACCEL + \
|
||||
CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
|
||||
CONFIG_HEVC_VDPAU_HWACCEL)
|
||||
@@ -388,6 +389,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
@@ -399,6 +400,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
#endif
|
||||
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
|
||||
@ -69,7 +69,7 @@ index 2c33a1ff57..d717850eeb 100644
|
||||
#endif
|
||||
break;
|
||||
case AV_PIX_FMT_YUV420P10:
|
||||
@@ -406,6 +410,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
@@ -417,6 +421,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
#endif
|
||||
#if CONFIG_HEVC_NVDEC_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_CUDA;
|
||||
@ -78,8 +78,8 @@ index 2c33a1ff57..d717850eeb 100644
|
||||
+ *fmt++ = AV_PIX_FMT_DRM_PRIME;
|
||||
#endif
|
||||
break;
|
||||
case AV_PIX_FMT_YUV420P12:
|
||||
@@ -3566,6 +3573,9 @@ AVCodec ff_hevc_decoder = {
|
||||
case AV_PIX_FMT_YUV444P:
|
||||
@@ -3592,6 +3599,9 @@ AVCodec ff_hevc_decoder = {
|
||||
#endif
|
||||
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
|
||||
HWACCEL_VIDEOTOOLBOX(hevc),
|
||||
@ -634,6 +634,3 @@ index 0000000000..da1fd666d7
|
||||
+ .frame_params = ff_v4l2_request_frame_params,
|
||||
+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
|
||||
+};
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 13e487a5da1f64901391b99aa094a697fd2889aa Mon Sep 17 00:00:00 2001
|
||||
From 1084cad0a91e33a95150ff82f1d4ce2a0c180e2c Mon Sep 17 00:00:00 2001
|
||||
From: Boris Brezillon <boris.brezillon@collabora.com>
|
||||
Date: Wed, 22 May 2019 14:46:58 +0200
|
||||
Subject: [PATCH 06/12] Add V4L2 request API vp8 hwaccel
|
||||
@ -17,31 +17,31 @@ Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
create mode 100644 libavcodec/v4l2_request_vp8.c
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index d07cd27d88..46bcf32d3d 100755
|
||||
index d51ee62a70..6bdfe6fd95 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2884,6 +2884,8 @@ vp8_nvdec_hwaccel_deps="nvdec"
|
||||
@@ -2975,6 +2975,8 @@ vp8_nvdec_hwaccel_deps="nvdec"
|
||||
vp8_nvdec_hwaccel_select="vp8_decoder"
|
||||
vp8_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferVP8"
|
||||
vp8_vaapi_hwaccel_deps="vaapi"
|
||||
vp8_vaapi_hwaccel_select="vp8_decoder"
|
||||
+vp8_v4l2request_hwaccel_deps="v4l2_request vp8_v4l2_request"
|
||||
+vp8_v4l2request_hwaccel_select="vp8_decoder"
|
||||
vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9"
|
||||
vp9_d3d11va_hwaccel_select="vp9_decoder"
|
||||
vp9_d3d11va2_hwaccel_deps="d3d11va DXVA_PicParams_VP9"
|
||||
@@ -6250,6 +6252,7 @@ check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
@@ -6464,6 +6466,7 @@ check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns
|
||||
check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE;"
|
||||
check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;"
|
||||
check_cc mpeg2_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2_SLICE;"
|
||||
+check_cc vp8_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_VP8_FRAME;"
|
||||
|
||||
check_header sys/videoio.h
|
||||
check_headers sys/videoio.h
|
||||
test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
|
||||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
|
||||
index a4c959e0f5..0249defb4f 100644
|
||||
index 2b53d2b650..55fa28548b 100644
|
||||
--- a/libavcodec/Makefile
|
||||
+++ b/libavcodec/Makefile
|
||||
@@ -890,6 +890,7 @@ OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o
|
||||
@@ -910,6 +910,7 @@ OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o
|
||||
OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
|
||||
OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.o
|
||||
OBJS-$(CONFIG_VP8_VAAPI_HWACCEL) += vaapi_vp8.o
|
||||
@ -248,7 +248,7 @@ index 0000000000..d24252c5e5
|
||||
+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
|
||||
+};
|
||||
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
|
||||
index 62b9f8bc2d..55966b9d56 100644
|
||||
index 3ddc349a4d..d4289320a9 100644
|
||||
--- a/libavcodec/vp8.c
|
||||
+++ b/libavcodec/vp8.c
|
||||
@@ -175,6 +175,9 @@ static enum AVPixelFormat get_pixel_format(VP8Context *s)
|
||||
@ -270,7 +270,7 @@ index 62b9f8bc2d..55966b9d56 100644
|
||||
s->pix_fmt = get_pixel_format(s);
|
||||
if (s->pix_fmt < 0)
|
||||
return AVERROR(EINVAL);
|
||||
@@ -2969,6 +2972,9 @@ AVCodec ff_vp8_decoder = {
|
||||
@@ -2981,6 +2984,9 @@ AVCodec ff_vp8_decoder = {
|
||||
#endif
|
||||
#if CONFIG_VP8_NVDEC_HWACCEL
|
||||
HWACCEL_NVDEC(vp8),
|
||||
@ -280,6 +280,3 @@ index 62b9f8bc2d..55966b9d56 100644
|
||||
#endif
|
||||
NULL
|
||||
},
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 23e7417b7ceb66f2ff4a98da5b1785d24994f865 Mon Sep 17 00:00:00 2001
|
||||
From e19fbf3c8c161a24e039b93dee2281d5b22e2ca8 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Thu, 14 Feb 2019 23:20:05 +0100
|
||||
Subject: [PATCH 07/12] Add and use private linux headers for V4L2 request API
|
||||
@ -22,10 +22,10 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
create mode 100644 libavcodec/vp8-ctrls.h
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 46bcf32d3d..0c842b920f 100755
|
||||
index 6bdfe6fd95..e3a3d82395 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2804,7 +2804,7 @@ h264_dxva2_hwaccel_deps="dxva2"
|
||||
@@ -2895,7 +2895,7 @@ h264_dxva2_hwaccel_deps="dxva2"
|
||||
h264_dxva2_hwaccel_select="h264_decoder"
|
||||
h264_nvdec_hwaccel_deps="nvdec"
|
||||
h264_nvdec_hwaccel_select="h264_decoder"
|
||||
@ -34,7 +34,7 @@ index 46bcf32d3d..0c842b920f 100755
|
||||
h264_v4l2request_hwaccel_select="h264_decoder"
|
||||
h264_vaapi_hwaccel_deps="vaapi"
|
||||
h264_vaapi_hwaccel_select="h264_decoder"
|
||||
@@ -2820,7 +2820,7 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
|
||||
@@ -2911,7 +2911,7 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
|
||||
hevc_dxva2_hwaccel_select="hevc_decoder"
|
||||
hevc_nvdec_hwaccel_deps="nvdec"
|
||||
hevc_nvdec_hwaccel_select="hevc_decoder"
|
||||
@ -43,9 +43,9 @@ index 46bcf32d3d..0c842b920f 100755
|
||||
hevc_v4l2request_hwaccel_select="hevc_decoder"
|
||||
hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
|
||||
hevc_vaapi_hwaccel_select="hevc_decoder"
|
||||
@@ -2884,7 +2884,7 @@ vp8_nvdec_hwaccel_deps="nvdec"
|
||||
@@ -2975,7 +2975,7 @@ vp8_nvdec_hwaccel_deps="nvdec"
|
||||
vp8_nvdec_hwaccel_select="vp8_decoder"
|
||||
vp8_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferVP8"
|
||||
vp8_vaapi_hwaccel_deps="vaapi"
|
||||
vp8_vaapi_hwaccel_select="vp8_decoder"
|
||||
-vp8_v4l2request_hwaccel_deps="v4l2_request vp8_v4l2_request"
|
||||
+vp8_v4l2request_hwaccel_deps="v4l2_request"
|
||||
@ -757,6 +757,3 @@ index 0000000000..53cba826e4
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 6b20e11c96907fb474b1bf33615223bf79eba9c0 Mon Sep 17 00:00:00 2001
|
||||
From 60383b61fa64aa0e2806de0b8cf8a3f8d85c41e4 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Mon, 29 Apr 2019 22:08:59 +0000
|
||||
Subject: [PATCH 08/12] hwcontext_drm: do not require drm device
|
||||
@ -24,6 +24,3 @@ index 32cbde82eb..aa4794c5e6 100644
|
||||
hwctx->fd = open(device, O_RDWR);
|
||||
if (hwctx->fd < 0)
|
||||
return AVERROR(errno);
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 4c1ce1fde5ca6d3e80bb0d5ab44f2e05f8372db0 Mon Sep 17 00:00:00 2001
|
||||
From 4e1a25f7cbbe9978548680171580afdfbf84d603 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Wed, 20 Feb 2019 11:18:00 -0300
|
||||
Subject: [PATCH 09/12] avcodec/h264: parse idr_pic_id
|
||||
@ -11,10 +11,10 @@ Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
3 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
|
||||
index f1e11003af..a795fcf66d 100644
|
||||
index 9912ede703..18ba196246 100644
|
||||
--- a/libavcodec/h264_slice.c
|
||||
+++ b/libavcodec/h264_slice.c
|
||||
@@ -1768,7 +1768,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
@@ -1824,7 +1824,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
}
|
||||
|
||||
if (nal->type == H264_NAL_IDR_SLICE)
|
||||
@ -49,6 +49,3 @@ index ca306b6a3f..f21c8b3508 100644
|
||||
.pic_order_cnt_lsb = sl->poc_lsb,
|
||||
.delta_pic_order_cnt_bottom = sl->delta_poc_bottom,
|
||||
.delta_pic_order_cnt0 = sl->delta_poc[0],
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 0a7b4a2cffae5d37b753b3e4cc8cadd7204ef5f5 Mon Sep 17 00:00:00 2001
|
||||
From 8309a49f4049b6ec8d4fd76a5dc18f8d23f8315c Mon Sep 17 00:00:00 2001
|
||||
From: Boris Brezillon <boris.brezillon@collabora.com>
|
||||
Date: Wed, 22 May 2019 14:44:22 +0200
|
||||
Subject: [PATCH 10/12] avcodec/h264: parse ref_pic_marking_size_in_bits and
|
||||
@ -12,10 +12,10 @@ Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
|
||||
3 files changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
|
||||
index a795fcf66d..9059e98a16 100644
|
||||
index 18ba196246..1bd3388f1e 100644
|
||||
--- a/libavcodec/h264_slice.c
|
||||
+++ b/libavcodec/h264_slice.c
|
||||
@@ -1680,7 +1680,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
@@ -1736,7 +1736,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
unsigned int slice_type, tmp, i;
|
||||
int field_pic_flag, bottom_field_flag;
|
||||
int first_slice = sl == h->slice_ctx && !h->current_slice;
|
||||
@ -24,7 +24,7 @@ index a795fcf66d..9059e98a16 100644
|
||||
|
||||
if (first_slice)
|
||||
av_assert0(!h->setup_finished);
|
||||
@@ -1770,6 +1770,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
@@ -1826,6 +1826,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
if (nal->type == H264_NAL_IDR_SLICE)
|
||||
sl->idr_pic_id = get_ue_golomb_long(&sl->gb);
|
||||
|
||||
@ -32,7 +32,7 @@ index a795fcf66d..9059e98a16 100644
|
||||
if (sps->poc_type == 0) {
|
||||
sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb);
|
||||
|
||||
@@ -1783,6 +1784,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
@@ -1839,6 +1840,7 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME)
|
||||
sl->delta_poc[1] = get_se_golomb(&sl->gb);
|
||||
}
|
||||
@ -40,7 +40,7 @@ index a795fcf66d..9059e98a16 100644
|
||||
|
||||
sl->redundant_pic_count = 0;
|
||||
if (pps->redundant_pic_cnt_present)
|
||||
@@ -1822,9 +1824,11 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
@@ -1878,9 +1880,11 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
||||
|
||||
sl->explicit_ref_marking = 0;
|
||||
if (nal->ref_idc) {
|
||||
@ -86,6 +86,3 @@ index f21c8b3508..1a7fb873a0 100644
|
||||
|
||||
.cabac_init_idc = sl->cabac_init_idc,
|
||||
.slice_qp_delta = sl->qscale - pps->init_qp,
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 1a2197eea4da8f118726963e0c74647532029306 Mon Sep 17 00:00:00 2001
|
||||
From ace9eff28953b97fc1832913d4655c0f4227ea16 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Fri, 24 May 2019 22:58:24 +0000
|
||||
Subject: [PATCH 11/12] HACK: add dpb flags for reference usage and field
|
||||
@ -55,6 +55,3 @@ index 1a7fb873a0..13fac3f6f9 100644
|
||||
}
|
||||
|
||||
return 0;
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From a205c82e430dafd90485b804ce40c1b42cbf9edf Mon Sep 17 00:00:00 2001
|
||||
From fa3f88530ec9083ff15d9637a9019a8a9408435b Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 9 Nov 2019 10:02:43 +0000
|
||||
Subject: [PATCH 12/12] WIP: v4l2-request: rolling timestamps
|
||||
@ -67,6 +67,3 @@ index d4146bd4ee..72698f6f3c 100644
|
||||
} V4L2RequestContext;
|
||||
|
||||
typedef struct V4L2RequestBuffer {
|
||||
--
|
||||
2.24.0
|
||||
|
||||
|
@ -0,0 +1,73 @@
|
||||
From 7134be3260ca6b885aa20447a06d35cab380a09e Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Tue, 24 Apr 2018 22:48:23 -0700
|
||||
Subject: [PATCH 01/14] libavcodec: v4l2m2m: fix indentation and add
|
||||
M2MDEC_CLASS
|
||||
|
||||
This just makes the M2MDEC_CLASS similar to how it is done in rkmpp. It looks
|
||||
clean and has proper indentation
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 46 ++++++++++++++++++++-------------------
|
||||
1 file changed, 24 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index d0601f0e2f..e1b6925771 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -209,29 +209,31 @@ static const AVOption options[] = {
|
||||
{ NULL},
|
||||
};
|
||||
|
||||
+#define M2MDEC_CLASS(NAME) \
|
||||
+ static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \
|
||||
+ .class_name = #NAME "_v4l2_m2m_decoder", \
|
||||
+ .item_name = av_default_item_name, \
|
||||
+ .option = options, \
|
||||
+ .version = LIBAVUTIL_VERSION_INT, \
|
||||
+ };
|
||||
+
|
||||
#define M2MDEC(NAME, LONGNAME, CODEC, bsf_name) \
|
||||
-static const AVClass v4l2_m2m_ ## NAME ## _dec_class = {\
|
||||
- .class_name = #NAME "_v4l2_m2m_decoder",\
|
||||
- .item_name = av_default_item_name,\
|
||||
- .option = options,\
|
||||
- .version = LIBAVUTIL_VERSION_INT,\
|
||||
-};\
|
||||
-\
|
||||
-AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
|
||||
- .name = #NAME "_v4l2m2m" ,\
|
||||
- .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"),\
|
||||
- .type = AVMEDIA_TYPE_VIDEO,\
|
||||
- .id = CODEC ,\
|
||||
- .priv_data_size = sizeof(V4L2m2mPriv),\
|
||||
- .priv_class = &v4l2_m2m_ ## NAME ## _dec_class,\
|
||||
- .init = v4l2_decode_init,\
|
||||
- .receive_frame = v4l2_receive_frame,\
|
||||
- .close = ff_v4l2_m2m_codec_end,\
|
||||
- .bsfs = bsf_name, \
|
||||
- .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | \
|
||||
- AV_CODEC_CAP_AVOID_PROBING, \
|
||||
- .wrapper_name = "v4l2m2m", \
|
||||
-};
|
||||
+ M2MDEC_CLASS(NAME) \
|
||||
+ AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
|
||||
+ .name = #NAME "_v4l2m2m" , \
|
||||
+ .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"), \
|
||||
+ .type = AVMEDIA_TYPE_VIDEO, \
|
||||
+ .id = CODEC , \
|
||||
+ .priv_data_size = sizeof(V4L2m2mPriv), \
|
||||
+ .priv_class = &v4l2_m2m_ ## NAME ## _dec_class, \
|
||||
+ .init = v4l2_decode_init, \
|
||||
+ .receive_frame = v4l2_receive_frame, \
|
||||
+ .close = ff_v4l2_m2m_codec_end, \
|
||||
+ .bsfs = bsf_name, \
|
||||
+ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
|
||||
+ AV_CODEC_CAP_AVOID_PROBING, \
|
||||
+ .wrapper_name = "v4l2m2m", \
|
||||
+ };
|
||||
|
||||
M2MDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb");
|
||||
M2MDEC(hevc, "HEVC", AV_CODEC_ID_HEVC, "hevc_mp4toannexb");
|
||||
--
|
||||
2.24.1
|
||||
|
@ -1,74 +1,32 @@
|
||||
From 5c80d25f8f3821118fd4050321ac89e23bbedc8e Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Tue, 24 Apr 2018 22:48:23 -0700
|
||||
Subject: [PATCH 1/6] libavcodec: v4l2m2m: fix indentation and add M2MDEC_CLASS
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 44 ++++++++++++++++++++-------------------
|
||||
1 file changed, 23 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index bca45be1484..ed5193ecc17 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -202,28 +202,30 @@ static const AVOption options[] = {
|
||||
{ NULL},
|
||||
};
|
||||
|
||||
+#define M2MDEC_CLASS(NAME) \
|
||||
+ static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \
|
||||
+ .class_name = #NAME "_v4l2_m2m_decoder", \
|
||||
+ .item_name = av_default_item_name, \
|
||||
+ .option = options, \
|
||||
+ .version = LIBAVUTIL_VERSION_INT, \
|
||||
+ };
|
||||
+
|
||||
#define M2MDEC(NAME, LONGNAME, CODEC, bsf_name) \
|
||||
-static const AVClass v4l2_m2m_ ## NAME ## _dec_class = {\
|
||||
- .class_name = #NAME "_v4l2_m2m_decoder",\
|
||||
- .item_name = av_default_item_name,\
|
||||
- .option = options,\
|
||||
- .version = LIBAVUTIL_VERSION_INT,\
|
||||
-};\
|
||||
-\
|
||||
-AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
|
||||
- .name = #NAME "_v4l2m2m" ,\
|
||||
- .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"),\
|
||||
- .type = AVMEDIA_TYPE_VIDEO,\
|
||||
- .id = CODEC ,\
|
||||
- .priv_data_size = sizeof(V4L2m2mPriv),\
|
||||
- .priv_class = &v4l2_m2m_ ## NAME ## _dec_class,\
|
||||
- .init = v4l2_decode_init,\
|
||||
- .receive_frame = v4l2_receive_frame,\
|
||||
- .close = ff_v4l2_m2m_codec_end,\
|
||||
- .bsfs = bsf_name, \
|
||||
- .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
|
||||
- .wrapper_name = "v4l2m2m", \
|
||||
-};
|
||||
+ M2MDEC_CLASS(NAME) \
|
||||
+ AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
|
||||
+ .name = #NAME "_v4l2m2m" , \
|
||||
+ .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"), \
|
||||
+ .type = AVMEDIA_TYPE_VIDEO, \
|
||||
+ .id = CODEC , \
|
||||
+ .priv_data_size = sizeof(V4L2m2mPriv), \
|
||||
+ .priv_class = &v4l2_m2m_ ## NAME ## _dec_class, \
|
||||
+ .init = v4l2_decode_init, \
|
||||
+ .receive_frame = v4l2_receive_frame, \
|
||||
+ .close = ff_v4l2_m2m_codec_end, \
|
||||
+ .bsfs = bsf_name, \
|
||||
+ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
|
||||
+ .wrapper_name = "v4l2m2m", \
|
||||
+ };
|
||||
|
||||
M2MDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb");
|
||||
M2MDEC(hevc, "HEVC", AV_CODEC_ID_HEVC, "hevc_mp4toannexb");
|
||||
|
||||
From ba04ebfb7ec5df1dff44b7cd6c0daac9146dcf3a Mon Sep 17 00:00:00 2001
|
||||
From bf9fb2d576488ba08832e7cb7b10fe05a08665a5 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Tue, 24 Apr 2018 23:00:23 -0700
|
||||
Subject: [PATCH 2/6] libavcodec: v4l2m2m: output AVDRMFrameDescriptor
|
||||
Subject: [PATCH 02/14] libavcodec: v4l2m2m: output AVDRMFrameDescriptor
|
||||
|
||||
This allows for a zero-copy output by exporting the v4l2 buffer then wrapping that buffer
|
||||
in the AVDRMFrameDescriptor like it is done in rkmpp.
|
||||
|
||||
This has been in use for quite some time with great success on many platforms including:
|
||||
- Amlogic S905
|
||||
- Raspberry Pi
|
||||
- i.MX6
|
||||
- Dragonboard 410c
|
||||
|
||||
This was developed in conjunction with Kodi to allow handling the zero-copy buffer rendering.
|
||||
A simply utility for testing is also available here: https://github.com/BayLibre/ffmpeg-drm
|
||||
|
||||
todo:
|
||||
- allow selecting pixel format output from decoder
|
||||
- allow configuring amount of output and capture buffers
|
||||
|
||||
V2:
|
||||
- allow selecting AV_PIX_FMT_DRM_PRIME
|
||||
|
||||
V3:
|
||||
- use get_format to select AV_PIX_FMT_DRM_PRIME
|
||||
- use hw_configs
|
||||
- add handling of AV_PIX_FMT_YUV420P format (for raspberry pi)
|
||||
- add handling of AV_PIX_FMT_YUYV422 format (for i.MX6 coda decoder)
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 216 ++++++++++++++++++++++++++++++++------
|
||||
libavcodec/v4l2_buffers.h | 4 +
|
||||
@ -79,7 +37,7 @@ Subject: [PATCH 2/6] libavcodec: v4l2m2m: output AVDRMFrameDescriptor
|
||||
6 files changed, 253 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index aef911f3bbc..e5c46ac81e6 100644
|
||||
index aef911f3bb..e5c46ac81e 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -21,6 +21,7 @@
|
||||
@ -373,7 +331,7 @@ index aef911f3bbc..e5c46ac81e6 100644
|
||||
}
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h
|
||||
index dc5cc9e2671..a8a50ecc65f 100644
|
||||
index 7a57caf949..19324541d0 100644
|
||||
--- a/libavcodec/v4l2_buffers.h
|
||||
+++ b/libavcodec/v4l2_buffers.h
|
||||
@@ -27,6 +27,7 @@
|
||||
@ -395,7 +353,7 @@ index dc5cc9e2671..a8a50ecc65f 100644
|
||||
* of how many context-refs we are holding. */
|
||||
AVBufferRef *context_ref;
|
||||
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
|
||||
index efcb0426e49..9457fadb1e9 100644
|
||||
index efcb0426e4..9457fadb1e 100644
|
||||
--- a/libavcodec/v4l2_context.c
|
||||
+++ b/libavcodec/v4l2_context.c
|
||||
@@ -393,22 +393,54 @@ static int v4l2_release_buffers(V4L2Context* ctx)
|
||||
@ -458,7 +416,7 @@ index efcb0426e49..9457fadb1e9 100644
|
||||
|
||||
static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt)
|
||||
diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c
|
||||
index 427e165f586..7896326e808 100644
|
||||
index 427e165f58..7896326e80 100644
|
||||
--- a/libavcodec/v4l2_m2m.c
|
||||
+++ b/libavcodec/v4l2_m2m.c
|
||||
@@ -159,7 +159,9 @@ static int v4l2_configure_contexts(V4L2m2mContext* s)
|
||||
@ -473,7 +431,7 @@ index 427e165f586..7896326e808 100644
|
||||
ret = ff_v4l2_context_init(&s->capture);
|
||||
if (ret) {
|
||||
diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h
|
||||
index 452bf0d9bc2..9ac5a2448da 100644
|
||||
index 0d4671beb1..043a81a86a 100644
|
||||
--- a/libavcodec/v4l2_m2m.h
|
||||
+++ b/libavcodec/v4l2_m2m.h
|
||||
@@ -59,6 +59,9 @@ typedef struct V4L2m2mContext {
|
||||
@ -487,7 +445,7 @@ index 452bf0d9bc2..9ac5a2448da 100644
|
||||
|
||||
typedef struct V4L2m2mPriv
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index ed5193ecc17..7f41e3b2121 100644
|
||||
index e1b6925771..b28f4e236a 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -23,12 +23,18 @@
|
||||
@ -509,7 +467,7 @@ index ed5193ecc17..7f41e3b2121 100644
|
||||
#include "v4l2_context.h"
|
||||
#include "v4l2_m2m.h"
|
||||
#include "v4l2_fmt.h"
|
||||
@@ -183,6 +189,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx)
|
||||
@@ -186,6 +192,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx)
|
||||
capture->av_codec_id = AV_CODEC_ID_RAWVIDEO;
|
||||
capture->av_pix_fmt = avctx->pix_fmt;
|
||||
|
||||
@ -524,8 +482,8 @@ index ed5193ecc17..7f41e3b2121 100644
|
||||
+
|
||||
ret = ff_v4l2_m2m_codec_init(avctx);
|
||||
if (ret) {
|
||||
av_log(avctx, AV_LOG_ERROR, "can't configure decoder\n");
|
||||
@@ -202,6 +217,11 @@ static const AVOption options[] = {
|
||||
V4L2m2mPriv *priv = avctx->priv_data;
|
||||
@@ -209,6 +224,11 @@ static const AVOption options[] = {
|
||||
{ NULL},
|
||||
};
|
||||
|
||||
@ -537,7 +495,7 @@ index ed5193ecc17..7f41e3b2121 100644
|
||||
#define M2MDEC_CLASS(NAME) \
|
||||
static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \
|
||||
.class_name = #NAME "_v4l2_m2m_decoder", \
|
||||
@@ -222,7 +242,10 @@ static const AVOption options[] = {
|
||||
@@ -229,7 +249,10 @@ static const AVOption options[] = {
|
||||
.init = v4l2_decode_init, \
|
||||
.receive_frame = v4l2_receive_frame, \
|
||||
.close = ff_v4l2_m2m_codec_end, \
|
||||
@ -546,223 +504,8 @@ index ed5193ecc17..7f41e3b2121 100644
|
||||
.bsfs = bsf_name, \
|
||||
+ .hw_configs = v4l2_m2m_hw_configs, \
|
||||
.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
|
||||
AV_CODEC_CAP_AVOID_PROBING, \
|
||||
.wrapper_name = "v4l2m2m", \
|
||||
};
|
||||
--
|
||||
2.24.1
|
||||
|
||||
From 56b801661f935994d971c6b4aaf0d0ed3c4ca83f Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Tue, 8 May 2018 22:40:23 -0700
|
||||
Subject: [PATCH 3/6] libavcodec: v4l2m2m: adjust formatting
|
||||
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 23 +++++++++++++++--------
|
||||
libavcodec/v4l2_buffers.h | 1 -
|
||||
2 files changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index e5c46ac81e6..897c3c46369 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -401,7 +401,8 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i
|
||||
bytesused = FFMIN(size, out->plane_info[plane].length);
|
||||
length = out->plane_info[plane].length;
|
||||
|
||||
- memcpy(out->plane_info[plane].mm_addr, data, FFMIN(size, out->plane_info[plane].length));
|
||||
+ memcpy(out->plane_info[plane].mm_addr, data,
|
||||
+ FFMIN(size, out->plane_info[plane].length));
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) {
|
||||
out->planes[plane].bytesused = bytesused;
|
||||
@@ -425,7 +426,10 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer* out)
|
||||
int i, ret;
|
||||
|
||||
for(i = 0; i < out->num_planes; i++) {
|
||||
- ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, frame->buf[i]);
|
||||
+ ret = v4l2_bufref_to_buf(out, i,
|
||||
+ frame->buf[i]->data,
|
||||
+ frame->buf[i]->size,
|
||||
+ frame->buf[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -480,8 +484,8 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
|
||||
/* 2. get frame information */
|
||||
frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME);
|
||||
frame->color_primaries = v4l2_get_color_primaries(avbuf);
|
||||
- frame->colorspace = v4l2_get_color_space(avbuf);
|
||||
frame->color_range = v4l2_get_color_range(avbuf);
|
||||
+ frame->colorspace = v4l2_get_color_space(avbuf);
|
||||
frame->color_trc = v4l2_get_color_trc(avbuf);
|
||||
frame->pts = v4l2_get_pts(avbuf);
|
||||
|
||||
@@ -507,7 +511,8 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ? avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused;
|
||||
+ pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ?
|
||||
+ avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused;
|
||||
pkt->data = pkt->buf->data;
|
||||
|
||||
if (avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME)
|
||||
@@ -563,6 +568,7 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
/* in MP, the V4L2 API states that buf.length means num_planes */
|
||||
if (avbuf->num_planes >= avbuf->buf.length)
|
||||
break;
|
||||
+
|
||||
if (avbuf->buf.m.planes[avbuf->num_planes].length)
|
||||
avbuf->num_planes++;
|
||||
}
|
||||
@@ -579,12 +585,14 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length;
|
||||
avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset);
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.planes[i].m.mem_offset);
|
||||
} else {
|
||||
avbuf->plane_info[i].length = avbuf->buf.length;
|
||||
avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset);
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.offset);
|
||||
}
|
||||
|
||||
if (avbuf->plane_info[i].mm_addr == MAP_FAILED)
|
||||
@@ -594,9 +602,8 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
avbuf->status = V4L2BUF_AVAILABLE;
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
|
||||
- avbuf->buf.m.planes = avbuf->planes;
|
||||
avbuf->buf.length = avbuf->num_planes;
|
||||
-
|
||||
+ avbuf->buf.m.planes = avbuf->planes;
|
||||
} else {
|
||||
avbuf->buf.bytesused = avbuf->planes[0].bytesused;
|
||||
avbuf->buf.length = avbuf->planes[0].length;
|
||||
diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h
|
||||
index a8a50ecc65f..c609a6c6767 100644
|
||||
--- a/libavcodec/v4l2_buffers.h
|
||||
+++ b/libavcodec/v4l2_buffers.h
|
||||
@@ -131,5 +131,4 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index);
|
||||
*/
|
||||
int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf);
|
||||
|
||||
-
|
||||
#endif // AVCODEC_V4L2_BUFFERS_H
|
||||
|
||||
From 992ecd533321b876438fe3c4b7630003f260974e Mon Sep 17 00:00:00 2001
|
||||
From: Jorge Ramirez-Ortiz <jramirez@baylibre.com>
|
||||
Date: Sun, 6 May 2018 19:56:30 +0200
|
||||
Subject: [PATCH 4/6] libavcodec: v4l2m2m: fix error handling during buffer
|
||||
init
|
||||
|
||||
Signed-off-by: Jorge Ramirez-Ortiz <jramirez@baylibre.com>
|
||||
---
|
||||
libavcodec/v4l2_context.c | 19 ++++++++++++++++---
|
||||
libavcodec/v4l2_m2m_dec.c | 11 ++++++++---
|
||||
2 files changed, 24 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
|
||||
index 9457fadb1e9..fd3161ce2f5 100644
|
||||
--- a/libavcodec/v4l2_context.c
|
||||
+++ b/libavcodec/v4l2_context.c
|
||||
@@ -263,6 +263,12 @@ static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout)
|
||||
/* if we are draining and there are no more capture buffers queued in the driver we are done */
|
||||
if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) {
|
||||
for (i = 0; i < ctx->num_buffers; i++) {
|
||||
+ /* catpture buffer initialization happens during decode hence
|
||||
+ * detection happens at runtime
|
||||
+ */
|
||||
+ if (!ctx->buffers)
|
||||
+ break;
|
||||
+
|
||||
if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER)
|
||||
goto start;
|
||||
}
|
||||
@@ -724,9 +730,8 @@ int ff_v4l2_context_init(V4L2Context* ctx)
|
||||
ctx->buffers[i].context = ctx;
|
||||
ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i);
|
||||
if (ret < 0) {
|
||||
- av_log(logger(ctx), AV_LOG_ERROR, "%s buffer initialization (%s)\n", ctx->name, av_err2str(ret));
|
||||
- av_free(ctx->buffers);
|
||||
- return ret;
|
||||
+ av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret));
|
||||
+ goto error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -739,4 +744,12 @@ int ff_v4l2_context_init(V4L2Context* ctx)
|
||||
V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline);
|
||||
|
||||
return 0;
|
||||
+
|
||||
+error:
|
||||
+ v4l2_release_buffers(ctx);
|
||||
+
|
||||
+ av_free(ctx->buffers);
|
||||
+ ctx->buffers = NULL;
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index 7f41e3b2121..d524fd29a6a 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -92,8 +92,8 @@ static int v4l2_try_start(AVCodecContext *avctx)
|
||||
if (!capture->buffers) {
|
||||
ret = ff_v4l2_context_init(capture);
|
||||
if (ret) {
|
||||
- av_log(avctx, AV_LOG_DEBUG, "can't request output buffers\n");
|
||||
- return ret;
|
||||
+ av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n");
|
||||
+ return AVERROR(ENOMEM);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,8 +155,13 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
|
||||
if (avpkt.size) {
|
||||
ret = v4l2_try_start(avctx);
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
+ /* cant recover */
|
||||
+ if (ret == AVERROR(ENOMEM))
|
||||
+ return ret;
|
||||
+
|
||||
return 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
dequeue:
|
||||
|
||||
From 98f828fcb15f2bcec11a6b8f56ae808c4c1220c2 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Sun, 17 Jun 2018 22:56:37 -0700
|
||||
Subject: [PATCH 6/6] libavcodec: v4l2m2m: make sure to unref avpkt
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index 6dd0de7ffcf..6fdbf8f16e4 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -156,6 +156,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
if (avpkt.size) {
|
||||
ret = v4l2_try_start(avctx);
|
||||
if (ret) {
|
||||
+ av_packet_unref(&avpkt);
|
||||
/* cant recover */
|
||||
if (ret == AVERROR(ENOMEM))
|
||||
return ret;
|
||||
@@ -165,6 +166,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
}
|
||||
|
||||
dequeue:
|
||||
+ av_packet_unref(&avpkt);
|
||||
return ff_v4l2_context_dequeue_frame(capture, frame);
|
||||
}
|
||||
|
@ -0,0 +1,106 @@
|
||||
From ebcfd47d8411fcc91d8058643b151068b5a7fedc Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Tue, 8 May 2018 22:40:23 -0700
|
||||
Subject: [PATCH 03/14] libavcodec: v4l2m2m: adjust formatting
|
||||
|
||||
just some simple formatting fixes that unify the code quality
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 23 +++++++++++++++--------
|
||||
libavcodec/v4l2_buffers.h | 1 -
|
||||
2 files changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index e5c46ac81e..897c3c4636 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -401,7 +401,8 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i
|
||||
bytesused = FFMIN(size, out->plane_info[plane].length);
|
||||
length = out->plane_info[plane].length;
|
||||
|
||||
- memcpy(out->plane_info[plane].mm_addr, data, FFMIN(size, out->plane_info[plane].length));
|
||||
+ memcpy(out->plane_info[plane].mm_addr, data,
|
||||
+ FFMIN(size, out->plane_info[plane].length));
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) {
|
||||
out->planes[plane].bytesused = bytesused;
|
||||
@@ -425,7 +426,10 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer* out)
|
||||
int i, ret;
|
||||
|
||||
for(i = 0; i < out->num_planes; i++) {
|
||||
- ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, frame->buf[i]);
|
||||
+ ret = v4l2_bufref_to_buf(out, i,
|
||||
+ frame->buf[i]->data,
|
||||
+ frame->buf[i]->size,
|
||||
+ frame->buf[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -480,8 +484,8 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
|
||||
/* 2. get frame information */
|
||||
frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME);
|
||||
frame->color_primaries = v4l2_get_color_primaries(avbuf);
|
||||
- frame->colorspace = v4l2_get_color_space(avbuf);
|
||||
frame->color_range = v4l2_get_color_range(avbuf);
|
||||
+ frame->colorspace = v4l2_get_color_space(avbuf);
|
||||
frame->color_trc = v4l2_get_color_trc(avbuf);
|
||||
frame->pts = v4l2_get_pts(avbuf);
|
||||
|
||||
@@ -507,7 +511,8 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ? avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused;
|
||||
+ pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ?
|
||||
+ avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused;
|
||||
pkt->data = pkt->buf->data;
|
||||
|
||||
if (avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME)
|
||||
@@ -563,6 +568,7 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
/* in MP, the V4L2 API states that buf.length means num_planes */
|
||||
if (avbuf->num_planes >= avbuf->buf.length)
|
||||
break;
|
||||
+
|
||||
if (avbuf->buf.m.planes[avbuf->num_planes].length)
|
||||
avbuf->num_planes++;
|
||||
}
|
||||
@@ -579,12 +585,14 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length;
|
||||
avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset);
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.planes[i].m.mem_offset);
|
||||
} else {
|
||||
avbuf->plane_info[i].length = avbuf->buf.length;
|
||||
avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset);
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.offset);
|
||||
}
|
||||
|
||||
if (avbuf->plane_info[i].mm_addr == MAP_FAILED)
|
||||
@@ -594,9 +602,8 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
avbuf->status = V4L2BUF_AVAILABLE;
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
|
||||
- avbuf->buf.m.planes = avbuf->planes;
|
||||
avbuf->buf.length = avbuf->num_planes;
|
||||
-
|
||||
+ avbuf->buf.m.planes = avbuf->planes;
|
||||
} else {
|
||||
avbuf->buf.bytesused = avbuf->planes[0].bytesused;
|
||||
avbuf->buf.length = avbuf->planes[0].length;
|
||||
diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h
|
||||
index 19324541d0..b6072baec8 100644
|
||||
--- a/libavcodec/v4l2_buffers.h
|
||||
+++ b/libavcodec/v4l2_buffers.h
|
||||
@@ -131,5 +131,4 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index);
|
||||
*/
|
||||
int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf);
|
||||
|
||||
-
|
||||
#endif // AVCODEC_V4L2_BUFFERS_H
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,84 @@
|
||||
From db39d4579d36266a3f3b87312303d5097543633d Mon Sep 17 00:00:00 2001
|
||||
From: Jorge Ramirez-Ortiz <jramirez@baylibre.com>
|
||||
Date: Sun, 6 May 2018 19:56:30 +0200
|
||||
Subject: [PATCH 04/14] libavcodec: v4l2m2m: fix error handling during buffer
|
||||
init
|
||||
|
||||
Signed-off-by: Jorge Ramirez-Ortiz <jramirez@baylibre.com>
|
||||
---
|
||||
libavcodec/v4l2_context.c | 19 ++++++++++++++++---
|
||||
libavcodec/v4l2_m2m_dec.c | 9 +++++++--
|
||||
2 files changed, 23 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
|
||||
index 9457fadb1e..12d40d597e 100644
|
||||
--- a/libavcodec/v4l2_context.c
|
||||
+++ b/libavcodec/v4l2_context.c
|
||||
@@ -263,6 +263,12 @@ static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout)
|
||||
/* if we are draining and there are no more capture buffers queued in the driver we are done */
|
||||
if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) {
|
||||
for (i = 0; i < ctx->num_buffers; i++) {
|
||||
+ /* capture buffer initialization happens during decode hence
|
||||
+ * detection happens at runtime
|
||||
+ */
|
||||
+ if (!ctx->buffers)
|
||||
+ break;
|
||||
+
|
||||
if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER)
|
||||
goto start;
|
||||
}
|
||||
@@ -724,9 +730,8 @@ int ff_v4l2_context_init(V4L2Context* ctx)
|
||||
ctx->buffers[i].context = ctx;
|
||||
ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i);
|
||||
if (ret < 0) {
|
||||
- av_log(logger(ctx), AV_LOG_ERROR, "%s buffer initialization (%s)\n", ctx->name, av_err2str(ret));
|
||||
- av_free(ctx->buffers);
|
||||
- return ret;
|
||||
+ av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret));
|
||||
+ goto error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -739,4 +744,12 @@ int ff_v4l2_context_init(V4L2Context* ctx)
|
||||
V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline);
|
||||
|
||||
return 0;
|
||||
+
|
||||
+error:
|
||||
+ v4l2_release_buffers(ctx);
|
||||
+
|
||||
+ av_free(ctx->buffers);
|
||||
+ ctx->buffers = NULL;
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index b28f4e236a..fb5406a74e 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -92,8 +92,8 @@ static int v4l2_try_start(AVCodecContext *avctx)
|
||||
if (!capture->buffers) {
|
||||
ret = ff_v4l2_context_init(capture);
|
||||
if (ret) {
|
||||
- av_log(avctx, AV_LOG_DEBUG, "can't request output buffers\n");
|
||||
- return ret;
|
||||
+ av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n");
|
||||
+ return AVERROR(ENOMEM);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,6 +157,11 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
ret = v4l2_try_start(avctx);
|
||||
if (ret) {
|
||||
av_packet_unref(&avpkt);
|
||||
+
|
||||
+ /* cant recover */
|
||||
+ if (ret == AVERROR(ENOMEM))
|
||||
+ return ret;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 86a709f752d430166b9c1e26fa639886710b79ad Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Thu, 16 Aug 2018 21:09:40 -0700
|
||||
Subject: [PATCH 05/14] libavcodec: v4l2m2m: depends on libdrm
|
||||
|
||||
---
|
||||
configure | 1 +
|
||||
libavcodec/v4l2_buffers.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 34c2adb4a4..b72f1d6270 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -3343,6 +3343,7 @@ sndio_indev_deps="sndio"
|
||||
sndio_outdev_deps="sndio"
|
||||
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
|
||||
v4l2_indev_suggest="libv4l2"
|
||||
+v4l2_outdev_deps="libdrm"
|
||||
v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h"
|
||||
v4l2_outdev_suggest="libv4l2"
|
||||
vfwcap_indev_deps="vfw32 vfwcap_defines"
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index 897c3c4636..d6838866b7 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -21,7 +21,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
-#include <drm/drm_fourcc.h>
|
||||
+#include <drm_fourcc.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From e657b496a21056d51f17f187dfdf0c62d1da13f2 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Thu, 16 Aug 2018 21:10:13 -0700
|
||||
Subject: [PATCH 06/14] libavcodec: v4l2m2m: set format_modifier to
|
||||
DRM_FORMAT_MOD_LINEAR
|
||||
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index d6838866b7..d879aab7b1 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -321,10 +321,12 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf)
|
||||
/* drm frame */
|
||||
avbuf->drm_frame.objects[i].size = avbuf->buf.m.planes[i].length;
|
||||
avbuf->drm_frame.objects[i].fd = expbuf.fd;
|
||||
+ avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR;
|
||||
} else {
|
||||
/* drm frame */
|
||||
avbuf->drm_frame.objects[0].size = avbuf->buf.length;
|
||||
avbuf->drm_frame.objects[0].fd = expbuf.fd;
|
||||
+ avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,50 @@
|
||||
From 013503bba6eefa10caffe2451fe375b31ed1584a Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Thu, 16 Aug 2018 21:10:53 -0700
|
||||
Subject: [PATCH 07/14] libavcodec: v4l2m2m: only mmap the buffer when it is
|
||||
output type and drm prime is used
|
||||
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 24 ++++++++++++++++--------
|
||||
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index d879aab7b1..ee19bb5b6f 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -585,16 +585,24 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
|
||||
avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length;
|
||||
- avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length,
|
||||
- PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd,
|
||||
- avbuf->buf.m.planes[i].m.mem_offset);
|
||||
+
|
||||
+ if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) ||
|
||||
+ !buf_to_m2mctx(avbuf)->output_drm) {
|
||||
+ avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length,
|
||||
+ PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.planes[i].m.mem_offset);
|
||||
+ }
|
||||
} else {
|
||||
avbuf->plane_info[i].length = avbuf->buf.length;
|
||||
- avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length,
|
||||
- PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
- buf_to_m2mctx(avbuf)->fd,
|
||||
- avbuf->buf.m.offset);
|
||||
+
|
||||
+ if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) ||
|
||||
+ !buf_to_m2mctx(avbuf)->output_drm) {
|
||||
+ avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length,
|
||||
+ PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
+ buf_to_m2mctx(avbuf)->fd,
|
||||
+ avbuf->buf.m.offset);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (avbuf->plane_info[i].mm_addr == MAP_FAILED)
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From f3df44dbdf5e7ca66064c0ac9ae0f84bbcc245e9 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Thu, 16 Aug 2018 21:11:38 -0700
|
||||
Subject: [PATCH 08/14] libavcodec: v4l2m2m: allow using software pixel formats
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index fb5406a74e..8834b3d6fc 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -203,8 +203,16 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx)
|
||||
* - the DRM frame format is passed in the DRM frame descriptor layer.
|
||||
* check the v4l2_get_drm_frame function.
|
||||
*/
|
||||
- if (ff_get_format(avctx, avctx->codec->pix_fmts) == AV_PIX_FMT_DRM_PRIME)
|
||||
+ switch (ff_get_format(avctx, avctx->codec->pix_fmts)) {
|
||||
+ case AV_PIX_FMT_DRM_PRIME:
|
||||
s->output_drm = 1;
|
||||
+ break;
|
||||
+ case AV_PIX_FMT_NONE:
|
||||
+ return 0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
ret = ff_v4l2_m2m_codec_init(avctx);
|
||||
if (ret) {
|
||||
@@ -255,6 +263,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = {
|
||||
.receive_frame = v4l2_receive_frame, \
|
||||
.close = ff_v4l2_m2m_codec_end, \
|
||||
.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \
|
||||
+ AV_PIX_FMT_NV12, \
|
||||
AV_PIX_FMT_NONE}, \
|
||||
.bsfs = bsf_name, \
|
||||
.hw_configs = v4l2_m2m_hw_configs, \
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 3af2830856f4356acb9bf1655adf632759782aac Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Mon, 24 Sep 2018 13:38:46 -0700
|
||||
Subject: [PATCH 09/14] libavcodec: v4l2m2m: fix decoder capabilities
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index 8834b3d6fc..0087de35d0 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -267,8 +267,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = {
|
||||
AV_PIX_FMT_NONE}, \
|
||||
.bsfs = bsf_name, \
|
||||
.hw_configs = v4l2_m2m_hw_configs, \
|
||||
- .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
|
||||
- AV_CODEC_CAP_AVOID_PROBING, \
|
||||
+ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \
|
||||
.wrapper_name = "v4l2m2m", \
|
||||
};
|
||||
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,101 @@
|
||||
From 8b7ec4eae175835a806619b0bba98eb6d7252a13 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Mon, 24 Sep 2018 13:39:31 -0700
|
||||
Subject: [PATCH 10/14] libavcodec: v4l2m2m: implement hwcontext
|
||||
|
||||
---
|
||||
libavcodec/v4l2_buffers.c | 22 ++++++++++++++++++++++
|
||||
libavcodec/v4l2_context.h | 2 ++
|
||||
libavcodec/v4l2_m2m.h | 2 ++
|
||||
libavcodec/v4l2_m2m_dec.c | 9 +++++++++
|
||||
4 files changed, 35 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
|
||||
index ee19bb5b6f..27820905b2 100644
|
||||
--- a/libavcodec/v4l2_buffers.c
|
||||
+++ b/libavcodec/v4l2_buffers.c
|
||||
@@ -456,6 +456,7 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
|
||||
|
||||
frame->data[0] = (uint8_t *) v4l2_get_drm_frame(avbuf);
|
||||
frame->format = AV_PIX_FMT_DRM_PRIME;
|
||||
+ frame->hw_frames_ctx = av_buffer_ref(avbuf->context->frames_ref);
|
||||
} else {
|
||||
/* 1. get references to the actual data */
|
||||
for (i = 0; i < avbuf->num_planes; i++) {
|
||||
@@ -555,6 +556,27 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index)
|
||||
avbuf->buf.type = ctx->type;
|
||||
avbuf->buf.index = index;
|
||||
|
||||
+ if (buf_to_m2mctx(avbuf)->output_drm) {
|
||||
+ AVHWFramesContext *hwframes;
|
||||
+
|
||||
+ av_buffer_unref(&ctx->frames_ref);
|
||||
+
|
||||
+ ctx->frames_ref = av_hwframe_ctx_alloc(buf_to_m2mctx(avbuf)->device_ref);
|
||||
+ if (!ctx->frames_ref) {
|
||||
+ ret = AVERROR(ENOMEM);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ hwframes = (AVHWFramesContext*)ctx->frames_ref->data;
|
||||
+ hwframes->format = AV_PIX_FMT_DRM_PRIME;
|
||||
+ hwframes->sw_format = ctx->av_pix_fmt;
|
||||
+ hwframes->width = ctx->width;
|
||||
+ hwframes->height = ctx->height;
|
||||
+ ret = av_hwframe_ctx_init(ctx->frames_ref);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
|
||||
avbuf->buf.length = VIDEO_MAX_PLANES;
|
||||
avbuf->buf.m.planes = avbuf->planes;
|
||||
diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h
|
||||
index 632f1d0aac..9a1dbbea60 100644
|
||||
--- a/libavcodec/v4l2_context.h
|
||||
+++ b/libavcodec/v4l2_context.h
|
||||
@@ -91,6 +91,8 @@ typedef struct V4L2Context {
|
||||
*/
|
||||
int done;
|
||||
|
||||
+ AVBufferRef *frames_ref;
|
||||
+
|
||||
} V4L2Context;
|
||||
|
||||
/**
|
||||
diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h
|
||||
index 043a81a86a..4475618392 100644
|
||||
--- a/libavcodec/v4l2_m2m.h
|
||||
+++ b/libavcodec/v4l2_m2m.h
|
||||
@@ -60,6 +60,8 @@ typedef struct V4L2m2mContext {
|
||||
/* Reference to self; only valid while codec is active. */
|
||||
AVBufferRef *self_ref;
|
||||
|
||||
+ AVBufferRef *device_ref;
|
||||
+
|
||||
/* generate DRM frames */
|
||||
int output_drm;
|
||||
} V4L2m2mContext;
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index 0087de35d0..fffeb49092 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -214,6 +214,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx)
|
||||
break;
|
||||
}
|
||||
|
||||
+ s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM);
|
||||
+ if (!s->device_ref) {
|
||||
+ ret = AVERROR(ENOMEM);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ ret = av_hwdevice_ctx_init(s->device_ref);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
ret = ff_v4l2_m2m_codec_init(avctx);
|
||||
if (ret) {
|
||||
V4L2m2mPriv *priv = avctx->priv_data;
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,50 @@
|
||||
From 799aa17fbaa5a5dda7fd8a04c71df905e363f6f3 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Mon, 24 Sep 2018 13:39:56 -0700
|
||||
Subject: [PATCH 11/14] libavcodec: v4l2m2m: implement flush
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index fffeb49092..47ac53df00 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -236,6 +236,25 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx)
|
||||
return v4l2_prepare_decoder(s);
|
||||
}
|
||||
|
||||
+static void v4l2_flush(AVCodecContext *avctx)
|
||||
+{
|
||||
+ V4L2m2mPriv *priv = avctx->priv_data;
|
||||
+ V4L2m2mContext* s = priv->context;
|
||||
+ int ret;
|
||||
+
|
||||
+ /* wait for pending buffer references */
|
||||
+ if (atomic_load(&s->refcount))
|
||||
+ while(sem_wait(&s->refsync) == -1 && errno == EINTR);
|
||||
+
|
||||
+ ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
|
||||
+ if (ret)
|
||||
+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name);
|
||||
+
|
||||
+ ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
|
||||
+ if (ret)
|
||||
+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name);
|
||||
+}
|
||||
+
|
||||
#define OFFSET(x) offsetof(V4L2m2mPriv, x)
|
||||
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
|
||||
|
||||
@@ -271,6 +290,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = {
|
||||
.init = v4l2_decode_init, \
|
||||
.receive_frame = v4l2_receive_frame, \
|
||||
.close = ff_v4l2_m2m_codec_end, \
|
||||
+ .flush = v4l2_flush, \
|
||||
.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \
|
||||
AV_PIX_FMT_NV12, \
|
||||
AV_PIX_FMT_NONE}, \
|
||||
--
|
||||
2.24.1
|
||||
|
@ -1,17 +1,17 @@
|
||||
From e5d21ff782977b0fe79a60796dc9d973d98e692c Mon Sep 17 00:00:00 2001
|
||||
From: Maxime Jourdan <mjourdan@baylibre.com>
|
||||
Date: Sun, 9 Sep 2018 17:22:35 +0200
|
||||
Subject: [PATCH] avcodec: v4l2_context: set frame SAR using VIDIOC_CROPCAP
|
||||
From f91c0f01a4c563129acd388272e0ac4795b83435 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Fri, 31 Jan 2020 08:33:02 -0800
|
||||
Subject: [PATCH 12/14] libavcodec: v4l2m2m: aspect ratio
|
||||
|
||||
---
|
||||
libavcodec/v4l2_context.c | 26 +++++++++++++++++++++++++-
|
||||
1 file changed, 25 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
|
||||
index efcb0426e4..8bff58ca5d 100644
|
||||
index 12d40d597e..5c51399a4c 100644
|
||||
--- a/libavcodec/v4l2_context.c
|
||||
+++ b/libavcodec/v4l2_context.c
|
||||
@@ -501,6 +501,24 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p)
|
||||
@@ -539,6 +539,24 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ index efcb0426e4..8bff58ca5d 100644
|
||||
/*****************************************************************************
|
||||
*
|
||||
* V4L2 Context Interface
|
||||
@@ -574,6 +592,7 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt)
|
||||
@@ -612,6 +630,7 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt)
|
||||
int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame)
|
||||
{
|
||||
V4L2Buffer* avbuf = NULL;
|
||||
@ -44,7 +44,7 @@ index efcb0426e4..8bff58ca5d 100644
|
||||
|
||||
/*
|
||||
* blocks until:
|
||||
@@ -588,7 +607,12 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame)
|
||||
@@ -626,7 +645,12 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame)
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
|
||||
@ -59,4 +59,5 @@ index efcb0426e4..8bff58ca5d 100644
|
||||
|
||||
int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt)
|
||||
--
|
||||
2.18.0
|
||||
2.24.1
|
||||
|
@ -1,8 +1,17 @@
|
||||
From da24c4a08dd820804d9bd0709815d954836277d8 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Fri, 31 Jan 2020 08:35:37 -0800
|
||||
Subject: [PATCH 13/14] libavcodec: v4l2m2m: save pkt
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m_dec.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
|
||||
index 80a09f7a43..af65927ac3 100644
|
||||
index 47ac53df00..cf48ff4b22 100644
|
||||
--- a/libavcodec/v4l2_m2m_dec.c
|
||||
+++ b/libavcodec/v4l2_m2m_dec.c
|
||||
@@ -125,6 +125,8 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s)
|
||||
@@ -131,6 +131,8 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -11,7 +20,7 @@ index 80a09f7a43..af65927ac3 100644
|
||||
static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
{
|
||||
V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
|
||||
@@ -133,9 +135,14 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
@@ -139,9 +141,14 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
AVPacket avpkt = {0};
|
||||
int ret;
|
||||
|
||||
@ -29,7 +38,7 @@ index 80a09f7a43..af65927ac3 100644
|
||||
|
||||
if (s->draining)
|
||||
goto dequeue;
|
||||
@@ -144,6 +151,8 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
@@ -150,6 +157,8 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
if (ret < 0) {
|
||||
if (ret != AVERROR(ENOMEM))
|
||||
return ret;
|
||||
@ -38,7 +47,7 @@ index 80a09f7a43..af65927ac3 100644
|
||||
/* no input buffers available, continue dequeing */
|
||||
}
|
||||
|
||||
@@ -156,7 +165,8 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
@@ -167,7 +176,8 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
||||
}
|
||||
|
||||
dequeue:
|
||||
@ -47,5 +56,7 @@ index 80a09f7a43..af65927ac3 100644
|
||||
+ av_packet_unref(&avpkt);
|
||||
return ff_v4l2_context_dequeue_frame(capture, frame);
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.24.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From d317cac9ec2470bcdb44f92a82b64e4d132aeb51 Mon Sep 17 00:00:00 2001
|
||||
From: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Fri, 31 Jan 2020 09:00:51 -0800
|
||||
Subject: [PATCH 14/14] libavcodec: v4l2m2m: only use a few output buffers
|
||||
|
||||
---
|
||||
libavcodec/v4l2_m2m.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h
|
||||
index 4475618392..7e075e7e80 100644
|
||||
--- a/libavcodec/v4l2_m2m.h
|
||||
+++ b/libavcodec/v4l2_m2m.h
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
#define V4L_M2M_DEFAULT_OPTS \
|
||||
{ "num_output_buffers", "Number of buffers in the output context",\
|
||||
- OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 6, INT_MAX, FLAGS }
|
||||
+ OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, FLAGS }
|
||||
|
||||
typedef struct V4L2m2mContext {
|
||||
char devname[PATH_MAX];
|
||||
--
|
||||
2.24.1
|
||||
|
@ -1,11 +0,0 @@
|
||||
--- a/libavcodec/v4l2_m2m.h 2018-07-22 11:04:44.223961230 +0100
|
||||
+++ b/libavcodec/v4l2_m2m.h 2018-07-30 18:19:54.780753049 +0100
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
#define V4L_M2M_DEFAULT_OPTS \
|
||||
{ "num_output_buffers", "Number of buffers in the output context",\
|
||||
- OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 6, INT_MAX, FLAGS }
|
||||
+ OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, FLAGS }
|
||||
|
||||
typedef struct V4L2m2mContext {
|
||||
char devname[PATH_MAX];
|
Loading…
x
Reference in New Issue
Block a user