[FFmpeg-devel] [PATCH v2 2/4] avcodec/av1dec: expose coded_lossless
Timo Rothenpieler
timo at rothenpieler.org
Tue Nov 10 15:43:12 EET 2020
Signed-off-by: Timo Rothenpieler <timo at rothenpieler.org>
Co-authored-by: James Almer <jamrial at gmail.com>
---
libavcodec/av1dec.c | 33 +++++++++++++++++++++++++++++++++
libavcodec/av1dec.h | 2 ++
2 files changed, 35 insertions(+)
diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index 1afed66499..87fd6bb2e3 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -217,6 +217,36 @@ static void skip_mode_params(AV1DecContext *s)
AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx);
}
+static void coded_lossless_param(AV1DecContext *s)
+{
+ const AV1RawFrameHeader *header = s->raw_frame_header;
+ int i;
+
+ if (header->delta_q_y_dc || header->delta_q_u_ac ||
+ header->delta_q_u_dc || header->delta_q_v_ac ||
+ header->delta_q_v_dc) {
+ s->cur_frame.coded_lossless = 0;
+ return;
+ }
+
+ s->cur_frame.coded_lossless = 1;
+ for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
+ int qindex;
+ if (header->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) {
+ qindex = (header->base_q_idx +
+ header->feature_value[i][AV1_SEG_LVL_ALT_Q]);
+ } else {
+ qindex = header->base_q_idx;
+ }
+ qindex = av_clip_uintp2(qindex, 8);
+
+ if (qindex) {
+ s->cur_frame.coded_lossless = 0;
+ return;
+ }
+ }
+}
+
static int init_tile_data(AV1DecContext *s)
{
@@ -391,6 +421,7 @@ static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f)
f->hwaccel_picture_private = NULL;
f->spatial_id = f->temporal_id = 0;
f->order_hint = 0;
+ f->coded_lossless = 0;
}
static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *src)
@@ -410,6 +441,7 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s
dst->spatial_id = src->spatial_id;
dst->temporal_id = src->temporal_id;
+ dst->coded_lossless = src->coded_lossless;
memcpy(dst->gm_type,
src->gm_type,
AV1_NUM_REF_FRAMES * sizeof(uint8_t));
@@ -691,6 +723,7 @@ static int get_current_frame(AVCodecContext *avctx)
global_motion_params(s);
skip_mode_params(s);
+ coded_lossless_param(s);
return ret;
}
diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h
index 8cf50f0d59..bed9376a36 100644
--- a/libavcodec/av1dec.h
+++ b/libavcodec/av1dec.h
@@ -44,6 +44,8 @@ typedef struct AV1Frame {
uint8_t order_hint;
uint8_t skip_mode_frame_idx[2];
+
+ uint8_t coded_lossless;
} AV1Frame;
typedef struct TileGroupInfo {
--
2.25.1
More information about the ffmpeg-devel
mailing list