< prev index next >

modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-good/gst/isomp4/qtdemux.c

Print this page
rev 11235 : imported patch 13.patch


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 


< prev index next >