9931 /* parse stsd */
9932 if (!(stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd)))
9933 goto corrupt_file;
9934 stsd_data = (const guint8 *) stsd->data;
9935
9936 /* stsd should at least have one entry */
9937 stsd_len = QT_UINT32 (stsd_data);
9938 if (stsd_len < 24) {
9939 /* .. but skip stream with empty stsd produced by some Vivotek cameras */
9940 if (stream->subtype == FOURCC_vivo) {
9941 if (new_stream)
9942 gst_qtdemux_stream_free (qtdemux, stream);
9943 return TRUE;
9944 } else {
9945 goto corrupt_file;
9946 }
9947 }
9948
9949 stream->stsd_entries_length = stsd_entry_count = QT_UINT32 (stsd_data + 12);
9950 stream->stsd_entries = g_new0 (QtDemuxStreamStsdEntry, stsd_entry_count);
9951 GST_LOG_OBJECT (qtdemux, "stsd len: %d", stsd_len);
9952 GST_LOG_OBJECT (qtdemux, "stsd entry count: %u", stsd_entry_count);
9953
9954 stsd_entry_data = stsd_data + 16;
9955 remaining_stsd_len = stsd_len - 16;
9956 for (stsd_index = 0; stsd_index < stsd_entry_count; stsd_index++) {
9957 guint32 fourcc;
9958 gchar *codec = NULL;
9959 QtDemuxStreamStsdEntry *entry = &stream->stsd_entries[stsd_index];
9960
9961 /* and that entry should fit within stsd */
9962 len = QT_UINT32 (stsd_entry_data);
9963 if (len > remaining_stsd_len)
9964 goto corrupt_file;
9965
9966 entry->fourcc = fourcc = QT_FOURCC (stsd_entry_data + 4);
9967 GST_LOG_OBJECT (qtdemux, "stsd type: %" GST_FOURCC_FORMAT,
9968 GST_FOURCC_ARGS (entry->fourcc));
9969 GST_LOG_OBJECT (qtdemux, "stsd type len: %d", len);
9970
|
9931 /* parse stsd */
9932 if (!(stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd)))
9933 goto corrupt_file;
9934 stsd_data = (const guint8 *) stsd->data;
9935
9936 /* stsd should at least have one entry */
9937 stsd_len = QT_UINT32 (stsd_data);
9938 if (stsd_len < 24) {
9939 /* .. but skip stream with empty stsd produced by some Vivotek cameras */
9940 if (stream->subtype == FOURCC_vivo) {
9941 if (new_stream)
9942 gst_qtdemux_stream_free (qtdemux, stream);
9943 return TRUE;
9944 } else {
9945 goto corrupt_file;
9946 }
9947 }
9948
9949 stream->stsd_entries_length = stsd_entry_count = QT_UINT32 (stsd_data + 12);
9950 stream->stsd_entries = g_new0 (QtDemuxStreamStsdEntry, stsd_entry_count);
9951 #ifdef GSTREAMER_LITE
9952 // Even if we check stsd header length (stsd_len) to make sure we have at least
9953 // one entry, we still might have actual entry count set to 0. g_new0() will
9954 // return NULL if fail or count is 0.
9955 if (stream->stsd_entries == NULL) {
9956 goto corrupt_file;
9957 }
9958 #endif // GSTREAMER_LITE
9959 GST_LOG_OBJECT (qtdemux, "stsd len: %d", stsd_len);
9960 GST_LOG_OBJECT (qtdemux, "stsd entry count: %u", stsd_entry_count);
9961
9962 stsd_entry_data = stsd_data + 16;
9963 remaining_stsd_len = stsd_len - 16;
9964 for (stsd_index = 0; stsd_index < stsd_entry_count; stsd_index++) {
9965 guint32 fourcc;
9966 gchar *codec = NULL;
9967 QtDemuxStreamStsdEntry *entry = &stream->stsd_entries[stsd_index];
9968
9969 /* and that entry should fit within stsd */
9970 len = QT_UINT32 (stsd_entry_data);
9971 if (len > remaining_stsd_len)
9972 goto corrupt_file;
9973
9974 entry->fourcc = fourcc = QT_FOURCC (stsd_entry_data + 4);
9975 GST_LOG_OBJECT (qtdemux, "stsd type: %" GST_FOURCC_FORMAT,
9976 GST_FOURCC_ARGS (entry->fourcc));
9977 GST_LOG_OBJECT (qtdemux, "stsd type len: %d", len);
9978
|