Commit 3e95d8ed authored by Ronald S. Bultje's avatar Ronald S. Bultje

Move Dav1dPictureParameters-related entries to top of Dav1dSeqHdr

Also remove redundant entries from Dav1dPictureParameters, and move
documentation of these fields into Dav1dFrame/SequenceHeader instead.
parent 9c4bf181
......@@ -161,7 +161,43 @@ enum Dav1dChromaSamplePosition {
};
typedef struct Dav1dSequenceHeader {
/**
* Stream profile, 0 for 8-10 bits/component 4:2:0 or monochrome;
* 1 for 8-10 bits/component 4:4:4; 2 for 4:2:2 at any bits/component,
* or 12 bits/component at any chroma subsampling.
*/
int profile;
/**
* Maximum dimensions for this stream. In non-scalable streams, these
* are often the actual dimensions of the stream, although that is not
* a normative requirement.
*/
int max_width, max_height;
int bpc; ///< bits per pixel component (8 or 10)
enum Dav1dPixelLayout layout; ///< format of the picture
enum Dav1dColorPrimaries pri; ///< color primaries (av1)
enum Dav1dTransferCharacteristics trc; ///< transfer characteristics (av1)
enum Dav1dMatrixCoefficients mtrx; ///< matrix coefficients (av1)
enum Dav1dChromaSamplePosition chr; ///< chroma sample position (av1)
/**
* Pixel data uses JPEG pixel range ([0,255] for 8bits) instead of
* MPEG pixel range ([16,235] for 8bits luma, [16,240] for 8bits chroma).
*/
int color_range;
int num_operating_points;
struct Dav1dSequenceHeaderOperatingPoint {
int major_level, minor_level;
int initial_display_delay;
int idc;
int tier;
int decoder_model_param_present;
int decoder_buffer_delay;
int encoder_buffer_delay;
int low_delay_mode;
int display_model_param_present;
} operating_points[DAV1D_MAX_OPERATING_POINTS];
int still_picture;
int reduced_still_picture_header;
int timing_info_present;
......@@ -175,19 +211,7 @@ typedef struct Dav1dSequenceHeader {
int buffer_removal_delay_length;
int frame_presentation_delay_length;
int display_model_info_present;
int num_operating_points;
struct Dav1dSequenceHeaderOperatingPoint {
int idc;
int major_level, minor_level;
int tier;
int decoder_model_param_present;
int decoder_buffer_delay;
int encoder_buffer_delay;
int low_delay_mode;
int display_model_param_present;
int initial_display_delay;
} operating_points[DAV1D_MAX_OPERATING_POINTS];
int max_width, max_height, width_n_bits, height_n_bits;
int width_n_bits, height_n_bits;
int frame_id_numbers_present;
int delta_frame_id_n_bits;
int frame_id_n_bits;
......@@ -207,15 +231,8 @@ typedef struct Dav1dSequenceHeader {
int super_res;
int cdef;
int restoration;
int bpc;
int hbd;
int color_description_present;
enum Dav1dPixelLayout layout;
enum Dav1dColorPrimaries pri;
enum Dav1dTransferCharacteristics trc;
enum Dav1dMatrixCoefficients mtrx;
enum Dav1dChromaSamplePosition chr;
int color_range;
int separate_uv_delta_q;
int film_grain_present;
} Dav1dSequenceHeader;
......@@ -260,11 +277,19 @@ typedef struct Dav1dFilmGrainData {
} Dav1dFilmGrainData;
typedef struct Dav1dFrameHeader {
enum Dav1dFrameType frame_type; ///< type of the picture
int width[2 /* { coded_width, superresolution_upscaled_width } */], height;
int frame_offset; ///< frame number
struct {
int present, update;
Dav1dFilmGrainData data;
} film_grain; ///< film grain parameters
int temporal_id, spatial_id; ///< spatial and temporal id of the frame for SVC
int show_existing_frame;
int existing_frame_idx;
int frame_id;
int frame_presentation_delay;
enum Dav1dFrameType frame_type;
int show_frame;
int showable_frame;
int error_resilient_mode;
......@@ -277,9 +302,7 @@ typedef struct Dav1dFrameHeader {
struct Dav1dFrameHeaderOperatingPoint {
int buffer_removal_time;
} operating_points[DAV1D_MAX_OPERATING_POINTS];
int frame_offset;
int refresh_frame_flags;
int width[2 /* { coded_width, superresolution_upscaled_width } */], height;
int render_width, render_height;
struct {
int width_scale_denominator;
......@@ -350,11 +373,6 @@ typedef struct Dav1dFrameHeader {
int warp_motion;
int reduced_txtp_set;
Dav1dWarpedMotionParams gmv[DAV1D_REFS_PER_FRAME];
struct {
int present, update;
Dav1dFilmGrainData data;
} film_grain;
int temporal_id, spatial_id;
} Dav1dFrameHeader;
#endif /* __DAV1D_HEADERS_H__ */
......@@ -38,25 +38,13 @@ typedef struct Dav1dPictureParameters {
int w; ///< width (in pixels)
int h; ///< height (in pixels)
enum Dav1dPixelLayout layout; ///< format of the picture
enum Dav1dFrameType type; ///< type of the picture
int bpc; ///< bits per pixel component (8 or 10)
enum Dav1dColorPrimaries pri; ///< color primaries (av1)
enum Dav1dTransferCharacteristics trc; ///< transfer characteristics (av1)
enum Dav1dMatrixCoefficients mtrx; ///< matrix coefficients (av1)
enum Dav1dChromaSamplePosition chr; ///< chroma sample position (av1)
/**
* Pixel data uses JPEG pixel range ([0,255] for 8bits) instead of
* MPEG pixel range ([16,235] for 8bits luma, [16,240] for 8bits chroma).
*/
int fullrange;
Dav1dFilmGrainData film_grain; ///< film grain parameters
int spatial_id; ///< spatial id of the frame for scalable AV1
} Dav1dPictureParameters;
typedef struct Dav1dPicture {
int poc; ///< frame number
struct Dav1dRef *frame_hdr_ref, *seq_hdr_ref;
Dav1dSequenceHeader *seq_hdr;
Dav1dFrameHeader *frame_hdr;
/**
* Pointers to planar image data (Y is [0], U is [1], V is [2]). The data
......@@ -67,9 +55,6 @@ typedef struct Dav1dPicture {
*/
void *data[3];
struct Dav1dRef *ref; ///< allocation origin
struct Dav1dRef *frame_hdr_ref, *seq_hdr_ref;
Dav1dSequenceHeader *seq_hdr;
Dav1dFrameHeader *frame_hdr;
/**
* Number of bytes between 2 lines in data[] for luma [0] or chroma [1].
......
......@@ -1543,9 +1543,10 @@ static int decode_b(Dav1dTileContext *const t,
if (f->seq_hdr->jnt_comp) {
const int jnt_ctx =
get_jnt_comp_ctx(f->seq_hdr->order_hint_n_bits,
f->cur.poc, f->refp[b->ref[0]].p.poc,
f->refp[b->ref[1]].p.poc, t->a, &t->l,
by4, bx4);
f->cur.frame_hdr->frame_offset,
f->refp[b->ref[0]].p.frame_hdr->frame_offset,
f->refp[b->ref[1]].p.frame_hdr->frame_offset,
t->a, &t->l, by4, bx4);
b->comp_type = COMP_INTER_WEIGHTED_AVG +
msac_decode_bool_adapt(&ts->msac,
ts->cdf.m.jnt_comp[jnt_ctx]);
......@@ -2683,7 +2684,9 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
const int order_hint_n_bits = f->seq_hdr->order_hint * f->seq_hdr->order_hint_n_bits;
const int ret = av1_init_ref_mv_common(f->libaom_cm, f->bw >> 1, f->bh >> 1,
f->b4_stride, f->seq_hdr->sb128,
f->mvs, f->ref_mvs, f->cur.poc, f->refpoc,
f->mvs, f->ref_mvs,
f->cur.frame_hdr->frame_offset,
f->refpoc,
f->refrefpoc, f->frame_hdr->gmv,
f->frame_hdr->hp, f->frame_hdr->force_integer_mv,
f->frame_hdr->use_ref_frame_mvs,
......@@ -2709,15 +2712,17 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
// setup jnt_comp weights
if (f->frame_hdr->switchable_comp_refs) {
for (int i = 0; i < 7; i++) {
const unsigned ref0poc = f->refp[i].p.poc;
const unsigned ref0poc = f->refp[i].p.frame_hdr->frame_offset;
for (int j = i + 1; j < 7; j++) {
const unsigned ref1poc = f->refp[j].p.poc;
const unsigned d1 = imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits,
ref0poc, f->cur.poc)), 31);
const unsigned d0 = imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits,
ref1poc, f->cur.poc)), 31);
const unsigned ref1poc = f->refp[j].p.frame_hdr->frame_offset;
const unsigned d1 =
imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits, ref0poc,
f->cur.frame_hdr->frame_offset)), 31);
const unsigned d0 =
imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits, ref1poc,
f->cur.frame_hdr->frame_offset)), 31);
const int order = d0 <= d1;
static const uint8_t quant_dist_weight[3][2] = {
......@@ -3114,16 +3119,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->frame_hdr->show_frame, &c->allocator);
if (res < 0) goto error;
f->sr_cur.p.poc = f->frame_hdr->frame_offset;
f->sr_cur.p.p.type = f->frame_hdr->frame_type;
f->sr_cur.p.p.film_grain = f->frame_hdr->film_grain.data;
f->sr_cur.p.p.pri = f->seq_hdr->pri;
f->sr_cur.p.p.trc = f->seq_hdr->trc;
f->sr_cur.p.p.mtrx = f->seq_hdr->mtrx;
f->sr_cur.p.p.chr = f->seq_hdr->chr;
f->sr_cur.p.p.fullrange = f->seq_hdr->color_range;
f->sr_cur.p.m = f->tile[0].data.m;
f->sr_cur.p.p.spatial_id = f->frame_hdr->spatial_id;
f->sr_cur.p.frame_hdr = f->frame_hdr;
f->sr_cur.p.frame_hdr_ref = f->frame_hdr_ref;
dav1d_ref_inc(f->frame_hdr_ref);
......@@ -3175,7 +3171,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->mvs = f->mvs_ref->data;
if (!f->frame_hdr->allow_intrabc) {
for (int i = 0; i < 7; i++)
f->refpoc[i] = f->refp[i].p.poc;
f->refpoc[i] = f->refp[i].p.frame_hdr->frame_offset;
} else {
memset(f->refpoc, 0, sizeof(f->refpoc));
}
......
......@@ -75,7 +75,7 @@ enum {
static void generate_grain_y(const Dav1dPicture *const in,
entry buf[GRAIN_HEIGHT][GRAIN_WIDTH])
{
const Dav1dFilmGrainData *data = &in->p.film_grain;
const Dav1dFilmGrainData *data = &in->frame_hdr->film_grain.data;
unsigned seed = data->seed;
const int shift = 12 - BITDEPTH + data->grain_scale_shift;
......@@ -111,7 +111,7 @@ static void generate_grain_uv(const Dav1dPicture *const in, int uv,
entry buf[GRAIN_HEIGHT][GRAIN_WIDTH],
entry buf_y[GRAIN_HEIGHT][GRAIN_WIDTH])
{
const Dav1dFilmGrainData *data = &in->p.film_grain;
const Dav1dFilmGrainData *data = &in->frame_hdr->film_grain.data;
unsigned seed = data->seed ^ (uv ? 0x49d8 : 0xb524);
const int shift = 12 - BITDEPTH + data->grain_scale_shift;
......@@ -211,7 +211,7 @@ static void apply_to_row_y(Dav1dPicture *const out, const Dav1dPicture *const in
entry grain_lut[GRAIN_HEIGHT][GRAIN_WIDTH],
uint8_t scaling[SCALING_SIZE], int row_num)
{
const Dav1dFilmGrainData *const data = &out->p.film_grain;
const Dav1dFilmGrainData *const data = &out->frame_hdr->film_grain.data;
const int rows = 1 + (data->overlap_flag && row_num > 0);
int min_value, max_value;
......@@ -330,13 +330,13 @@ static void apply_to_row_uv(Dav1dPicture *const out, const Dav1dPicture *const i
entry grain_lut[GRAIN_HEIGHT][GRAIN_WIDTH],
uint8_t scaling[SCALING_SIZE], int uv, int row_num)
{
const Dav1dFilmGrainData *const data = &out->p.film_grain;
const Dav1dFilmGrainData *const data = &out->frame_hdr->film_grain.data;
const int rows = 1 + (data->overlap_flag && row_num > 0);
int min_value, max_value;
if (data->clip_to_restricted_range) {
min_value = 16 << (BITDEPTH - 8);
if (out->p.mtrx == DAV1D_MC_IDENTITY) {
if (out->seq_hdr->mtrx == DAV1D_MC_IDENTITY) {
max_value = 235 << (BITDEPTH - 8);
} else {
max_value = 240 << (BITDEPTH - 8);
......@@ -477,7 +477,7 @@ static void apply_to_row_uv(Dav1dPicture *const out, const Dav1dPicture *const i
void bitfn(dav1d_apply_grain)(Dav1dPicture *const out,
const Dav1dPicture *const in)
{
const Dav1dFilmGrainData *const data = &out->p.film_grain;
const Dav1dFilmGrainData *const data = &out->frame_hdr->film_grain.data;
entry grain_lut[3][GRAIN_HEIGHT][GRAIN_WIDTH];
uint8_t scaling[3][SCALING_SIZE];
......
......@@ -183,14 +183,14 @@ int dav1d_send_data(Dav1dContext *const c, Dav1dData *const in)
static int output_image(Dav1dContext *const c, Dav1dPicture *const out,
Dav1dPicture *const in)
{
const Dav1dFilmGrainData *fgdata = &in->p.film_grain;
const Dav1dFilmGrainData *fgdata = &in->frame_hdr->film_grain.data;
int has_grain = fgdata->num_y_points || fgdata->num_uv_points[0] ||
fgdata->num_uv_points[1];
// skip lower spatial layers
if (c->operating_point_idc && !c->all_layers) {
const int max_spatial_id = ulog2(c->operating_point_idc >> 8);
if (max_spatial_id > in->p.spatial_id) {
if (max_spatial_id > in->frame_hdr->spatial_id) {
dav1d_picture_unref(in);
return 0;
}
......
......@@ -450,8 +450,10 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
int shifted_frame_offset[8];
const int current_frame_offset = 1 << (seqhdr->order_hint_n_bits - 1);
for (int i = 0; i < 8; i++)
shifted_frame_offset[i] =
current_frame_offset + get_poc_diff(seqhdr->order_hint_n_bits, c->refs[i].p.p.poc, hdr->frame_offset);
shifted_frame_offset[i] = current_frame_offset +
get_poc_diff(seqhdr->order_hint_n_bits,
c->refs[i].p.p.frame_hdr->frame_offset,
hdr->frame_offset);
int used_frame[8] = { 0 };
used_frame[hdr->refidx[0]] = 1;
......@@ -902,7 +904,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
int off_before_idx[2], off_after_idx;
for (int i = 0; i < 7; i++) {
if (!c->refs[hdr->refidx[i]].p.p.data[0]) return -EINVAL;
const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.poc;
const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset;
const int diff = get_poc_diff(seqhdr->order_hint_n_bits, refpoc, poc);
if (diff > 0) {
......@@ -1364,7 +1366,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
out_delayed->p.m = in->m;
pthread_mutex_unlock(&f->frame_thread.td.lock);
}
if (c->refs[c->frame_hdr->existing_frame_idx].p.p.p.type == DAV1D_FRAME_TYPE_KEY) {
if (c->refs[c->frame_hdr->existing_frame_idx].p.p.frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY) {
const int r = c->frame_hdr->existing_frame_idx;
for (int i = 0; i < 8; i++) {
if (i == c->frame_hdr->existing_frame_idx) continue;
......
......@@ -116,14 +116,9 @@ static int picture_alloc_with_edges(Dav1dPicture *const p,
p->p.w = w;
p->p.h = h;
p->p.pri = DAV1D_COLOR_PRI_UNKNOWN;
p->p.trc = DAV1D_TRC_UNKNOWN;
p->p.mtrx = DAV1D_MC_UNKNOWN;
p->p.chr = DAV1D_CHR_UNKNOWN;
p->m.timestamp = p->m.duration = p->m.offset = ~0ULL;
p->p.layout = layout;
p->p.bpc = bpc;
p->p.film_grain = (Dav1dFilmGrainData) { 0 };
int res = p_allocator->alloc_picture_callback(p, p_allocator->cookie);
if (res < 0) {
free(pic_ctx);
......@@ -176,7 +171,6 @@ int dav1d_picture_alloc_copy(Dav1dPicture *const dst, const int w,
0, NULL);
if (!res) {
dst->poc = src->poc;
dst->p = src->p;
dst->m = src->m;
dst->p.w = w;
......
......@@ -37,6 +37,8 @@
typedef struct MuxerPriv {
FILE *f;
int first;
unsigned fps[2];
} Y4m2OutputContext;
static int y4m2_open(Y4m2OutputContext *const c, const char *const file,
......@@ -49,6 +51,14 @@ static int y4m2_open(Y4m2OutputContext *const c, const char *const file,
return -1;
}
c->first = 1;
c->fps[0] = fps[0];
c->fps[1] = fps[1];
return 0;
}
static int write_header(Y4m2OutputContext *const c, const Dav1dPicture *const p) {
static const char *const ss_names[][2] = {
[DAV1D_PIXEL_LAYOUT_I400] = { "mono", "mono10" },
[DAV1D_PIXEL_LAYOUT_I420] = { NULL, "420p10" },
......@@ -62,17 +72,23 @@ static int y4m2_open(Y4m2OutputContext *const c, const char *const file,
[DAV1D_CHR_COLOCATED] = "420"
};
const char *const ss_name = p->layout == DAV1D_PIXEL_LAYOUT_I420 && p->bpc == 8 ?
chr_names_8bpc_i420[p->chr > 2 ? DAV1D_CHR_UNKNOWN : p->chr] :
ss_names[p->layout][p->bpc > 8];
const char *const ss_name =
p->seq_hdr->layout == DAV1D_PIXEL_LAYOUT_I420 && p->seq_hdr->bpc == 8 ?
chr_names_8bpc_i420[p->seq_hdr->chr > 2 ? DAV1D_CHR_UNKNOWN : p->seq_hdr->chr] :
ss_names[p->seq_hdr->layout][p->seq_hdr->bpc > 8];
fprintf(c->f, "YUV4MPEG2 W%d H%d F%d:%d Ip C%s\n",
p->w, p->h, fps[0], fps[1], ss_name);
p->p.w, p->p.h, c->fps[0], c->fps[1], ss_name);
return 0;
}
static int y4m2_write(Y4m2OutputContext *const c, Dav1dPicture *const p) {
if (c->first) {
c->first = 0;
const int res = write_header(c, p);
if (res < 0) return res;
}
fprintf(c->f, "FRAME\n");
uint8_t *ptr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment