Skip to content

Commit 5229205

Browse files
authored
Adds a helper function to decode tags by choice (#433)
1 parent a3d57c6 commit 5229205

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

lib/src/sv_tlv.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,17 +1228,31 @@ sv_tlv_find_tag(const uint8_t *tlv_data, size_t tlv_data_size, sv_tlv_tag_t tag,
12281228
return NULL;
12291229
}
12301230

1231-
bool
1232-
sv_tlv_find_and_decode_optional_tags(signed_video_t *self,
1231+
static bool
1232+
tag_is_present(sv_tlv_tag_t tag, const sv_tlv_tag_t *tags, size_t num_of_tags)
1233+
{
1234+
for (size_t i = 0; i < num_of_tags; i++) {
1235+
if (tag == tags[i]) {
1236+
return true;
1237+
}
1238+
}
1239+
1240+
return false;
1241+
}
1242+
1243+
static bool
1244+
sv_tlv_find_and_decode_tags(signed_video_t *self,
12331245
const uint8_t *tlv_data,
1234-
size_t tlv_data_size)
1246+
size_t tlv_data_size,
1247+
const sv_tlv_tag_t *tags,
1248+
size_t num_of_tags)
12351249
{
12361250
const uint8_t *tlv_data_ptr = tlv_data;
12371251

12381252
if (!self || !tlv_data || tlv_data_size == 0) return false;
12391253

12401254
svrc_t status = SV_UNKNOWN_FAILURE;
1241-
bool optional_tags_decoded = false;
1255+
int decoded_tags = 0;
12421256
while (tlv_data_ptr < tlv_data + tlv_data_size) {
12431257
size_t tlv_header_size = 0;
12441258
size_t length = 0;
@@ -1249,19 +1263,30 @@ sv_tlv_find_and_decode_optional_tags(signed_video_t *self,
12491263
break;
12501264
}
12511265
tlv_data_ptr += tlv_header_size;
1252-
if (!tlv_tuples[this_tag].is_always_present) {
1266+
if (tag_is_present(this_tag, tags, num_of_tags)) {
12531267
sv_tlv_decoder_t decoder = get_decoder(this_tag);
12541268
status = decoder(self, tlv_data_ptr, length);
12551269
if (status != SV_OK) {
12561270
DEBUG_LOG("Could not decode tlv values");
12571271
break;
12581272
}
1259-
optional_tags_decoded = true;
1273+
decoded_tags++;
12601274
}
12611275
tlv_data_ptr += length;
12621276
}
12631277

1264-
return optional_tags_decoded;
1278+
return decoded_tags > 0;
1279+
}
1280+
1281+
bool
1282+
sv_tlv_find_and_decode_optional_tags(signed_video_t *self,
1283+
const uint8_t *tlv_data,
1284+
size_t tlv_data_size)
1285+
{
1286+
size_t num_of_tags = 0;
1287+
const sv_tlv_tag_t *optional_tags = sv_get_optional_tags(&num_of_tags);
1288+
1289+
return sv_tlv_find_and_decode_tags(self, tlv_data, tlv_data_size, optional_tags, num_of_tags);
12651290
}
12661291

12671292
const sv_tlv_tag_t *

0 commit comments

Comments
 (0)