avcodec/aacdec_template: keep tabs on layout in sniff_channel_order

This way the layout set at various points can be checked instead
of only having the layout at the end.
pull/350/head
Jan Ekström 5 years ago
parent 026fea827d
commit de1d6aa0a3
  1. 55
      libavcodec/aacdec_template.c

@ -198,7 +198,7 @@ struct elem_to_channel {
static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID], static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
uint8_t (*layout_map)[3], int offset, uint64_t left, uint8_t (*layout_map)[3], int offset, uint64_t left,
uint64_t right, int pos) uint64_t right, int pos, uint64_t *layout)
{ {
if (layout_map[offset][0] == TYPE_CPE) { if (layout_map[offset][0] == TYPE_CPE) {
e2c_vec[offset] = (struct elem_to_channel) { e2c_vec[offset] = (struct elem_to_channel) {
@ -207,6 +207,9 @@ static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
.elem_id = layout_map[offset][1], .elem_id = layout_map[offset][1],
.aac_position = pos .aac_position = pos
}; };
if (e2c_vec[offset].av_position != UINT64_MAX)
*layout |= e2c_vec[offset].av_position;
return 1; return 1;
} else { } else {
e2c_vec[offset] = (struct elem_to_channel) { e2c_vec[offset] = (struct elem_to_channel) {
@ -221,6 +224,12 @@ static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
.elem_id = layout_map[offset + 1][1], .elem_id = layout_map[offset + 1][1],
.aac_position = pos .aac_position = pos
}; };
if (left != UINT64_MAX)
*layout |= left;
if (right != UINT64_MAX)
*layout |= right;
return 2; return 2;
} }
} }
@ -262,7 +271,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
int i, n, total_non_cc_elements; int i, n, total_non_cc_elements;
struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } }; struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } };
int num_front_channels, num_side_channels, num_back_channels; int num_front_channels, num_side_channels, num_back_channels;
uint64_t layout; uint64_t layout = 0;
if (FF_ARRAY_ELEMS(e2c_vec) < tags) if (FF_ARRAY_ELEMS(e2c_vec) < tags)
return 0; return 0;
@ -294,6 +303,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_FRONT .aac_position = AAC_CHANNEL_FRONT
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
num_front_channels--; num_front_channels--;
} }
@ -301,21 +311,21 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_FRONT_LEFT_OF_CENTER, AV_CH_FRONT_LEFT_OF_CENTER,
AV_CH_FRONT_RIGHT_OF_CENTER, AV_CH_FRONT_RIGHT_OF_CENTER,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
if (num_front_channels >= 2) { if (num_front_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_FRONT_LEFT, AV_CH_FRONT_LEFT,
AV_CH_FRONT_RIGHT, AV_CH_FRONT_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
while (num_front_channels >= 2) { while (num_front_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
@ -323,14 +333,14 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_SIDE_LEFT, AV_CH_SIDE_LEFT,
AV_CH_SIDE_RIGHT, AV_CH_SIDE_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_side_channels -= 2; num_side_channels -= 2;
} }
while (num_side_channels >= 2) { while (num_side_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_SIDE); AAC_CHANNEL_SIDE, &layout);
num_side_channels -= 2; num_side_channels -= 2;
} }
@ -338,14 +348,14 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_BACK); AAC_CHANNEL_BACK, &layout);
num_back_channels -= 2; num_back_channels -= 2;
} }
if (num_back_channels >= 2) { if (num_back_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_BACK_LEFT, AV_CH_BACK_LEFT,
AV_CH_BACK_RIGHT, AV_CH_BACK_RIGHT,
AAC_CHANNEL_BACK); AAC_CHANNEL_BACK, &layout);
num_back_channels -= 2; num_back_channels -= 2;
} }
if (num_back_channels) { if (num_back_channels) {
@ -355,6 +365,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_BACK .aac_position = AAC_CHANNEL_BACK
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
num_back_channels--; num_back_channels--;
} }
@ -366,6 +377,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_LFE .aac_position = AAC_CHANNEL_LFE
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
} }
if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
@ -375,6 +387,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_LFE .aac_position = AAC_CHANNEL_LFE
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
} }
while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
@ -394,41 +407,45 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.syn_ele = layout_map[i][0], .syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = layout_map[i][2] .aac_position = layout_map[i][2]
}; i++; }; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_FRONT_LEFT, AV_CH_TOP_FRONT_LEFT,
AV_CH_TOP_FRONT_RIGHT, AV_CH_TOP_FRONT_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT,
&layout);
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_SIDE_LEFT, AV_CH_TOP_SIDE_LEFT,
AV_CH_TOP_SIDE_RIGHT, AV_CH_TOP_SIDE_RIGHT,
AAC_CHANNEL_SIDE); AAC_CHANNEL_SIDE,
&layout);
e2c_vec[i] = (struct elem_to_channel) { e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_TOP_CENTER, .av_position = AV_CH_TOP_CENTER,
.syn_ele = layout_map[i][0], .syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = layout_map[i][2] .aac_position = layout_map[i][2]
}; i++; }; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_BACK_LEFT, AV_CH_TOP_BACK_LEFT,
AV_CH_TOP_BACK_RIGHT, AV_CH_TOP_BACK_RIGHT,
AAC_CHANNEL_BACK); AAC_CHANNEL_BACK,
&layout);
e2c_vec[i] = (struct elem_to_channel) { e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_TOP_BACK_CENTER, .av_position = AV_CH_TOP_BACK_CENTER,
.syn_ele = layout_map[i][0], .syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = layout_map[i][2] .aac_position = layout_map[i][2]
}; i++; }; layout |= e2c_vec[i].av_position; i++;
e2c_vec[i] = (struct elem_to_channel) { e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_BOTTOM_FRONT_CENTER, .av_position = AV_CH_BOTTOM_FRONT_CENTER,
.syn_ele = layout_map[i][0], .syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = layout_map[i][2] .aac_position = layout_map[i][2]
}; i++; }; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_BOTTOM_FRONT_LEFT, AV_CH_BOTTOM_FRONT_LEFT,
AV_CH_BOTTOM_FRONT_RIGHT, AV_CH_BOTTOM_FRONT_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT,
&layout);
} }
total_non_cc_elements = n = i; total_non_cc_elements = n = i;
@ -459,14 +476,10 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
} }
layout = 0;
for (i = 0; i < total_non_cc_elements; i++) { for (i = 0; i < total_non_cc_elements; i++) {
layout_map[i][0] = e2c_vec[i].syn_ele; layout_map[i][0] = e2c_vec[i].syn_ele;
layout_map[i][1] = e2c_vec[i].elem_id; layout_map[i][1] = e2c_vec[i].elem_id;
layout_map[i][2] = e2c_vec[i].aac_position; layout_map[i][2] = e2c_vec[i].aac_position;
if (e2c_vec[i].av_position != UINT64_MAX) {
layout |= e2c_vec[i].av_position;
}
} }
return layout; return layout;

Loading…
Cancel
Save