Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dd: Dependency Descriptor RTP header extension #1170

Merged
merged 8 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ set(HEADERS
include/re_convert.h
include/re_crc32.h
include/re_dbg.h
include/re_dd.h
include/re_dns.h
include/re_fmt.h
include/re_h264.h
Expand Down Expand Up @@ -226,6 +227,10 @@ set(SRCS

src/dbg/dbg.c

src/dd/dd.c
src/dd/dd_enc.c
src/dd/putbit.c

src/dns/client.c
src/dns/cstr.c
src/dns/dname.c
Expand Down
109 changes: 109 additions & 0 deletions include/re_dd.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/**
* @file re_dd.h Dependency Descriptor (DD)
*
* Copyright (C) 2010 - 2023 Alfred E. Heggestad
*/


/*
* Put bits wrapper (XXX: move to common place)
*/

struct putbit {
struct mbuf *mb;
size_t bit_pos;
};

void putbit_init(struct putbit *pb, struct mbuf *mb);
int putbit_one(struct putbit *pb, unsigned bit);
int putbit_write(struct putbit *pb, unsigned count, unsigned val);
int putbit_write_ns(struct putbit *pb, unsigned n, unsigned v);


/*
* Dependency Descriptor (DD)
*
* DT: Decode Target
* DTI: Decode Target Indication
* SID: Spatial ID
* TID: Temporal ID
*/

/* Constants. */
enum {
DD_MAX_SPATIAL_IDS = 4u,
DD_MAX_TEMPORAL_IDS = 4u,
DD_MAX_TEMPLATES = 8u,
DD_MAX_FDIFFS = 16u,
DD_MAX_DECODE_TARGETS= 16u,
DD_MAX_CHAINS = 32u,
};


/* Decode Target Indication (DTI) */
enum dd_dti {
DD_DTI_NOT_PRESENT = 0,
DD_DTI_DISCARDABLE = 1,
DD_DTI_SWITCH = 2,
DD_DTI_REQUIRED = 3,
};

enum dd_next_layer_idc {
DD_SAME_LAYER = 0,
DD_NEXT_TEMPORAL_LAYER = 1,
DD_NEXT_SPATIAL_LAYER = 2,
DD_NO_MORE_TEMPLATES = 3,
};

/*
* https://aomediacodec.github.io/av1-rtp-spec/
* #dependency-descriptor-rtp-header-extension
*/
struct dd {

/* Mandatory Descriptor Fields */
unsigned start_of_frame:1;
unsigned end_of_frame:1;
unsigned frame_dependency_template_id:6;
uint16_t frame_number;

// TODO: needed?
bool ext;

unsigned template_dependency_structure_present_flag:1;
unsigned active_decode_targets_present_flag:1;
unsigned custom_dtis_flag:1;
unsigned custom_fdiffs_flag:1;
unsigned custom_chains_flag:1;

unsigned active_decode_targets_bitmask;
unsigned template_id_offset:6;
uint8_t dt_cnt;
uint8_t template_cnt;
uint8_t max_spatial_id;

uint8_t template_spatial_id[DD_MAX_TEMPLATES];
uint8_t template_temporal_id[DD_MAX_TEMPLATES];

/* render_resolutions */
bool resolutions_present_flag;
uint16_t max_render_width_minus_1[DD_MAX_SPATIAL_IDS];
uint16_t max_render_height_minus_1[DD_MAX_SPATIAL_IDS];
uint8_t render_count;

/* type: enum dd_dti */
uint8_t template_dti[DD_MAX_TEMPLATES][DD_MAX_DECODE_TARGETS];

/* template fdiffs */
uint8_t template_fdiff[DD_MAX_TEMPLATES][DD_MAX_FDIFFS];
uint8_t template_fdiff_cnt[DD_MAX_TEMPLATES];

/* template chains */
uint8_t decode_target_protected_by[DD_MAX_DECODE_TARGETS];
uint8_t template_chain_fdiff[DD_MAX_TEMPLATES][DD_MAX_CHAINS];
uint8_t chain_cnt;
};

int dd_encode(struct mbuf *mb, const struct dd *dd);
int dd_decode(struct dd *dd, const uint8_t *buf, size_t sz);
void dd_print(const struct dd *dd);
18 changes: 18 additions & 0 deletions include/re_h264.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,21 @@ int h264_stap_encode(struct mbuf *mb, const uint8_t *frame,
size_t frame_sz);
int h264_stap_decode_annexb(struct mbuf *mb_frame, struct mbuf *mb_pkt);
int h264_stap_decode_annexb_long(struct mbuf *mb_frame, struct mbuf *mb_pkt);


/*
* Get bits wrapper
*/

struct getbit {
const uint8_t *buf;
size_t pos;
size_t end;
};

void getbit_init(struct getbit *gb, const uint8_t *buf, size_t size);
size_t getbit_get_left(const struct getbit *gb);
unsigned get_bit(struct getbit *gb);
int get_ue_golomb(struct getbit *gb, unsigned *valp);
unsigned get_bits(struct getbit *gb, unsigned n);
unsigned getbit_read_ns(struct getbit *gb, unsigned n);
61 changes: 61 additions & 0 deletions src/av1/getbit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* @file getbit.c Get bits helper
*
* Copyright (C) 2023 Alfred E. Heggestad
*/

#include <re.h>
#include <re_av1.h>


#define DEBUG_MODULE "av1"
#define DEBUG_LEVEL 5
#include <re_dbg.h>


void getbit_init(struct getbit *gb, const uint8_t *buf, size_t size_bits)
{
if (!gb)
return;

gb->buf = buf;
gb->pos = 0;
gb->end = size_bits;
}


size_t getbit_get_left(const struct getbit *gb)
{
if (!gb)
return 0;

if (gb->end > gb->pos)
return gb->end - gb->pos;
else
return 0;
}


unsigned get_bit(struct getbit *gb)
{
register unsigned tmp;

if (!gb)
return 0;

if (gb->pos >= gb->end) {
DEBUG_WARNING("get_bit: read past end"
" (%zu >= %zu)\n", gb->pos, gb->end);
assert(0);
return 0;
}

const uint8_t *p = gb->buf;
tmp = ((*(p + (gb->pos >> 0x3))) >> (0x7 - (gb->pos & 0x7))) & 0x1;

++gb->pos;

return tmp;
}


Loading
Loading