| #include <gst/check/gstcheck.h> |
| #include <gst/base/base.h> |
| #include <gst/isoff/gstisoff.h> |
| |
| #include "isoff.h" |
| |
| GST_START_TEST (isoff_box_header_minimal) |
| { |
| /* INDENT-OFF */ |
| static const guint8 data[] = { |
| 16, 32, 64, 128, |
| 't', 'e', 's', 't' |
| }; |
| /* INDENT-ON */ |
| GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data)); |
| guint32 type; |
| guint8 extended_type[16]; |
| guint header_size; |
| guint64 size; |
| |
| fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type, |
| &header_size, &size)); |
| fail_unless (type == GST_MAKE_FOURCC ('t', 'e', 's', 't')); |
| fail_unless_equals_int (header_size, 8); |
| fail_unless_equals_uint64 (size, 0x10204080); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (isoff_box_header_long_size) |
| { |
| /* INDENT-OFF */ |
| static const guint8 data[] = { |
| 0, 0, 0, 1, |
| 't', 'e', 's', 't', |
| 1, 2, 4, 8, 16, 32, 64, 128 |
| }; |
| /* INDENT-ON */ |
| GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data)); |
| guint32 type; |
| guint8 extended_type[16]; |
| guint header_size; |
| guint64 size; |
| |
| fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type, |
| &header_size, &size)); |
| fail_unless (type == GST_MAKE_FOURCC ('t', 'e', 's', 't')); |
| fail_unless_equals_int (header_size, 16); |
| fail_unless_equals_uint64 (size, G_GUINT64_CONSTANT (0x0102040810204080)); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (isoff_box_header_uuid_type) |
| { |
| /* INDENT-OFF */ |
| static const guint8 data[] = { |
| 16, 32, 64, 128, |
| 'u', 'u', 'i', 'd', |
| 'a', 'b', 'c', 'd', |
| 'e', 'f', 'g', 'h', |
| 'i', 'j', 'k', 'l', |
| 'm', 'n', 'o', 'p' |
| }; |
| /* INDENT-ON */ |
| GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data)); |
| guint32 type; |
| guint8 extended_type[16]; |
| guint header_size; |
| guint64 size; |
| |
| fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type, |
| &header_size, &size)); |
| fail_unless (type == GST_MAKE_FOURCC ('u', 'u', 'i', 'd')); |
| fail_unless_equals_int (header_size, 24); |
| fail_unless_equals_uint64 (size, 0x10204080); |
| fail_unless (memcmp (data + 8, extended_type, 16) == 0); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (isoff_box_header_uuid_type_long_size) |
| { |
| /* INDENT-OFF */ |
| static const guint8 data[] = { |
| 0, 0, 0, 1, |
| 'u', 'u', 'i', 'd', |
| 1, 2, 4, 8, 16, 32, 64, 128, |
| 'a', 'b', 'c', 'd', |
| 'e', 'f', 'g', 'h', |
| 'i', 'j', 'k', 'l', |
| 'm', 'n', 'o', 'p' |
| }; |
| /* INDENT-ON */ |
| GstByteReader reader = GST_BYTE_READER_INIT (data, sizeof (data)); |
| guint32 type; |
| guint8 extended_type[16]; |
| guint header_size; |
| guint64 size; |
| |
| fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type, |
| &header_size, &size)); |
| fail_unless (type == GST_MAKE_FOURCC ('u', 'u', 'i', 'd')); |
| fail_unless_equals_int (header_size, 32); |
| fail_unless_equals_uint64 (size, G_GUINT64_CONSTANT (0x0102040810204080)); |
| fail_unless (memcmp (data + 16, extended_type, 16) == 0); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (isoff_moof_parse) |
| { |
| /* INDENT-ON */ |
| GstByteReader reader = GST_BYTE_READER_INIT (moof1, sizeof (moof1)); |
| guint32 type; |
| guint8 extended_type[16]; |
| guint header_size; |
| guint64 size; |
| GstMoofBox *moof; |
| GstTrafBox *traf; |
| GstTrunBox *trun; |
| guint i; |
| |
| fail_unless (gst_isoff_parse_box_header (&reader, &type, extended_type, |
| &header_size, &size)); |
| fail_unless (type == GST_MAKE_FOURCC ('m', 'o', 'o', 'f')); |
| fail_unless_equals_int (header_size, 8); |
| fail_unless_equals_uint64 (size, sizeof (moof1)); |
| |
| moof = gst_isoff_moof_box_parse (&reader); |
| fail_unless (moof != NULL); |
| |
| fail_unless_equals_int (moof->mfhd.sequence_number, 1); |
| fail_unless_equals_int (moof->traf->len, 1); |
| |
| traf = &g_array_index (moof->traf, GstTrafBox, 0); |
| fail_unless_equals_int (traf->tfhd.version, 0); |
| fail_unless_equals_int (traf->tfhd.flags, |
| GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT); |
| fail_unless_equals_int (traf->tfhd.track_id, 1); |
| fail_unless_equals_uint64 (traf->tfhd.base_data_offset, 0); |
| fail_unless_equals_int (traf->tfhd.sample_description_index, 0); |
| fail_unless_equals_int (traf->tfhd.default_sample_duration, 8); |
| fail_unless_equals_int (traf->tfhd.default_sample_size, 0); |
| fail_unless_equals_int (traf->tfhd.default_sample_flags, 0); |
| |
| fail_unless_equals_int (traf->trun->len, 1); |
| trun = &g_array_index (traf->trun, GstTrunBox, 0); |
| |
| fail_unless_equals_int (trun->version, 1); |
| fail_unless_equals_int (trun->flags, |
| GST_TRUN_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSETS_PRESENT | |
| GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT | GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT | |
| GST_TRUN_FLAGS_DATA_OFFSET_PRESENT); |
| fail_unless_equals_int (trun->sample_count, 96); |
| fail_unless_equals_int (trun->data_offset, size + header_size); |
| fail_unless_equals_int (trun->first_sample_flags, 0); |
| |
| fail_unless_equals_int (trun->samples->len, 96); |
| |
| for (i = 0; i < 96; i++) { |
| GstTrunSample *sample = &g_array_index (trun->samples, GstTrunSample, i); |
| |
| fail_unless_equals_int (sample->sample_duration, 0); |
| if (i == 0) { |
| /* sample_depends_on = 2 => I-frame */ |
| /* sample_is_non_sync_sample = 0 */ |
| fail_unless_equals_int (sample->sample_flags, 0x02000000); |
| } else { |
| /* sample_depends_on = 1 => non-I-frame */ |
| /* sample_is_non_sync_sample = 1 */ |
| fail_unless_equals_int (sample->sample_flags, 0x01010000); |
| } |
| |
| /* sample size and CTO is changing for each sample */ |
| } |
| |
| gst_isoff_moof_box_free (moof); |
| } |
| |
| GST_END_TEST; |
| |
| static Suite * |
| dash_isoff_suite (void) |
| { |
| Suite *s = suite_create ("isoff"); |
| TCase *tc_isoff_box = tcase_create ("isoff-box-parsing"); |
| TCase *tc_moof = tcase_create ("moof"); |
| |
| tcase_add_test (tc_isoff_box, isoff_box_header_minimal); |
| tcase_add_test (tc_isoff_box, isoff_box_header_long_size); |
| tcase_add_test (tc_isoff_box, isoff_box_header_uuid_type); |
| tcase_add_test (tc_isoff_box, isoff_box_header_uuid_type_long_size); |
| |
| suite_add_tcase (s, tc_isoff_box); |
| |
| |
| tcase_add_test (tc_moof, isoff_moof_parse); |
| suite_add_tcase (s, tc_moof); |
| |
| return s; |
| } |
| |
| GST_CHECK_MAIN (dash_isoff); |