Changeset 254
- Timestamp:
- Oct 10, 2006, 9:02:55 PM (18 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 1 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/libmpdemux/demux_mkv.c ¶
r248 r254 267 267 extern int demux_aid_vid_mismatch; 268 268 269 /** 270 * \brief ensures there is space for at least one additional element 271 * \param array array to grow 272 * \param nelem current number of elements in array 273 * \param elsize size of one array element 274 */ 275 static void grow_array(void **array, int nelem, size_t elsize) { 276 if (!(nelem & 31)) 277 *array = realloc(*array, (nelem + 32) * elsize); 278 } 269 279 270 280 static mkv_track_t * … … 310 320 return; 311 321 312 if (!mkv_d->cluster_positions) 313 mkv_d->cluster_positions = (uint64_t *) malloc (32 * sizeof (uint64_t)); 314 else if (!(mkv_d->num_cluster_pos % 32)) 315 mkv_d->cluster_positions = (uint64_t *) realloc(mkv_d->cluster_positions, 316 (mkv_d->num_cluster_pos+32) 317 * sizeof (uint64_t)); 322 grow_array(&mkv_d->cluster_positions, mkv_d->num_cluster_pos, 323 sizeof(uint64_t)); 318 324 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position; 319 325 } … … 698 704 } 699 705 706 /** 707 * \brief free array of kv_content_encoding_t 708 * \param encodings pointer to array 709 * \param numencodings number of encodings in array 710 */ 711 static void 712 demux_mkv_free_encodings(mkv_content_encoding_t *encodings, int numencodings) 713 { 714 while (numencodings-- > 0) 715 free(encodings[numencodings].comp_settings); 716 free(encodings); 717 } 718 700 719 static int 701 720 demux_mkv_read_trackencodings (demuxer_t *demuxer, mkv_track_t *track) … … 736 755 num = ebml_read_uint (s, &l); 737 756 if (num == EBML_UINT_INVALID) 738 return 0;757 goto err_out; 739 758 e.order = num; 740 759 break; … … 743 762 num = ebml_read_uint (s, &l); 744 763 if (num == EBML_UINT_INVALID) 745 return 0;764 goto err_out; 746 765 e.scope = num; 747 766 break; … … 750 769 num = ebml_read_uint (s, &l); 751 770 if (num == EBML_UINT_INVALID) 752 return 0;771 goto err_out; 753 772 e.type = num; 754 773 break; … … 771 790 num = ebml_read_uint (s, &l); 772 791 if (num == EBML_UINT_INVALID) 773 return 0;792 goto err_out; 774 793 e.comp_algo = num; 775 794 break; … … 853 872 track->num_encodings = n; 854 873 return len; 874 875 err_out: 876 demux_mkv_free_encodings(ce, n); 877 return 0; 855 878 } 856 879 … … 992 1015 } 993 1016 1017 /** 1018 * \brief free any data associated with given track 1019 * \param track track of which to free data 1020 */ 1021 static void 1022 demux_mkv_free_trackentry(mkv_track_t *track) { 1023 if (track->name) 1024 free (track->name); 1025 if (track->codec_id) 1026 free (track->codec_id); 1027 if (track->language) 1028 free (track->language); 1029 if (track->private_data) 1030 free (track->private_data); 1031 if (track->audio_buf) 1032 free (track->audio_buf); 1033 if (track->audio_timestamp) 1034 free (track->audio_timestamp); 1035 #ifdef USE_ASS 1036 if (track->sh_sub.ass_track) 1037 ass_free_track (track->sh_sub.ass_track); 1038 #endif 1039 demux_mkv_free_encodings(track->encodings, track->num_encodings); 1040 free(track); 1041 } 1042 994 1043 static int 995 1044 demux_mkv_read_trackentry (demuxer_t *demuxer) … … 1017 1066 uint64_t num = ebml_read_uint (s, &l); 1018 1067 if (num == EBML_UINT_INVALID) 1019 return 0;1068 goto err_out; 1020 1069 track->tnum = num; 1021 1070 dprintf ("[mkv] | + Track number: %u\n", … … 1053 1102 l = demux_mkv_read_trackaudio (demuxer, track); 1054 1103 if (l == 0) 1055 return 0;1104 goto err_out; 1056 1105 break; 1057 1106 … … 1060 1109 l = demux_mkv_read_trackvideo (demuxer, track); 1061 1110 if (l == 0) 1062 return 0;1111 goto err_out; 1063 1112 break; 1064 1113 … … 1066 1115 track->codec_id = ebml_read_ascii (s, &l); 1067 1116 if (track->codec_id == NULL) 1068 return 0;1117 goto err_out; 1069 1118 if (!strcmp (track->codec_id, MKV_V_MSCOMP) || 1070 1119 !strcmp (track->codec_id, MKV_A_ACM)) … … 1098 1147 track->private_data = malloc (num); 1099 1148 if (stream_read(s, track->private_data, num) != (int) num) 1100 return 0;1149 goto err_out; 1101 1150 track->private_size = num; 1102 1151 dprintf ("[mkv] | + CodecPrivate, length " … … 1106 1155 1107 1156 case MATROSKA_ID_TRACKLANGUAGE: 1157 free(track->language); 1108 1158 track->language = ebml_read_utf8 (s, &l); 1109 1159 if (track->language == NULL) 1110 return 0;1160 goto err_out; 1111 1161 dprintf ("[mkv] | + Language: %s\n", 1112 1162 track->language); … … 1117 1167 uint64_t num = ebml_read_uint (s, &l); 1118 1168 if (num == EBML_UINT_INVALID) 1119 return 0;1169 goto err_out; 1120 1170 track->default_track = num; 1121 1171 dprintf ("[mkv] | + Default flag: %u\n", … … 1128 1178 uint64_t num = ebml_read_uint (s, &l); 1129 1179 if (num == EBML_UINT_INVALID) 1130 return 0;1180 goto err_out; 1131 1181 if (num == 0) 1132 1182 dprintf ("[mkv] | + Default duration: 0"); … … 1144 1194 l = demux_mkv_read_trackencodings (demuxer, track); 1145 1195 if (l == 0) 1146 return 0;1196 goto err_out; 1147 1197 break; 1148 1198 … … 1156 1206 mkv_d->tracks[mkv_d->num_tracks++] = track; 1157 1207 return len; 1208 1209 err_out: 1210 demux_mkv_free_trackentry(track); 1211 return 0; 1158 1212 } 1159 1213 … … 1291 1345 && pos != EBML_UINT_INVALID) 1292 1346 { 1293 if (mkv_d->indexes == NULL) 1294 mkv_d->indexes = (mkv_index_t *) malloc (32*sizeof (mkv_index_t)); 1295 else if (mkv_d->num_indexes % 32 == 0) 1296 mkv_d->indexes = (mkv_index_t *) realloc (mkv_d->indexes, 1297 (mkv_d->num_indexes+32) 1298 *sizeof (mkv_index_t)); 1347 grow_array(&mkv_d->indexes, mkv_d->num_indexes, sizeof(mkv_index_t)); 1299 1348 mkv_d->indexes[mkv_d->num_indexes].tnum = track; 1300 1349 mkv_d->indexes[mkv_d->num_indexes].timecode = time; … … 2486 2535 { 2487 2536 for (i=0; i<mkv_d->num_tracks; i++) 2488 { 2489 if (mkv_d->tracks[i]->codec_id) 2490 free (mkv_d->tracks[i]->codec_id); 2491 if (mkv_d->tracks[i]->language) 2492 free (mkv_d->tracks[i]->language); 2493 if (mkv_d->tracks[i]->private_data) 2494 free (mkv_d->tracks[i]->private_data); 2495 if (mkv_d->tracks[i]->audio_buf) 2496 free (mkv_d->tracks[i]->audio_buf); 2497 if (mkv_d->tracks[i]->audio_timestamp) 2498 free (mkv_d->tracks[i]->audio_timestamp); 2499 } 2537 demux_mkv_free_trackentry(mkv_d->tracks[i]); 2500 2538 for (i=0; i < SUB_MAX_TEXT; i++) 2501 2539 if (mkv_d->subs.text[i]) -
TabularUnified trunk/libmpdemux/demux_real.c ¶
r247 r254 69 69 extern int verbose; 70 70 typedef struct { 71 inttimestamp;71 unsigned int timestamp; 72 72 int offset; 73 73 // int packetno; … … 94 94 95 95 // timestamp correction: 96 int kf_base;// timestamp of the prev. video keyframe97 int kf_pts; // timestamp of next video keyframe98 int a_pts; // previous audio timestamp99 floatv_pts; // previous video timestamp96 unsigned int kf_base;// timestamp of the prev. video keyframe 97 unsigned int kf_pts; // timestamp of next video keyframe 98 unsigned int a_pts; // previous audio timestamp 99 double v_pts; // previous video timestamp 100 100 unsigned long duration; 101 101 … … 128 128 int audiopk_size[MAX_STREAMS]; ///< audio packet size 129 129 unsigned char *audio_buf; ///< place to store reordered audio data 130 float*audio_timestamp; ///< timestamp for each audio packet130 double *audio_timestamp; ///< timestamp for each audio packet 131 131 int sub_packet_cnt; ///< number of subpacket already received 132 132 int audio_filepos; ///< file position of first audio packet in block … … 187 187 { 188 188 #if 1 189 printf("i: %d, pos: %d, timestamp: %d\n", i, index[i].offset, index[i].timestamp);189 dprintf("i: %d, pos: %d, timestamp: %u\n", i, index[i].offset, index[i].timestamp); 190 190 #else 191 191 dprintf("packetno: %x pos: %x len: %x timestamp: %x flags: %x\n", … … 275 275 276 276 #if 1 277 static void add_index_item(demuxer_t *demuxer, int stream_id, int timestamp, int offset)277 static void add_index_item(demuxer_t *demuxer, int stream_id, unsigned int timestamp, int offset) 278 278 { 279 279 if ((unsigned)stream_id < MAX_STREAMS) … … 310 310 } 311 311 312 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int seek_timestamp)312 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int64_t seek_timestamp) 313 313 { 314 int tag, len, stream_id, timestamp, flags; 314 int tag, len, stream_id, flags; 315 unsigned int timestamp; 315 316 if (seek_timestamp != -1 && (unsigned)seek_stream_id >= MAX_STREAMS) 316 317 return; … … 346 347 } 347 348 } 348 // printf("Index: stream=%d packet=%d timestamp=% dlen=%d flags=0x%x datapos=0x%x\n", stream_id, entries, timestamp, len, flags, index->offset);349 // printf("Index: stream=%d packet=%d timestamp=%u len=%d flags=0x%x datapos=0x%x\n", stream_id, entries, timestamp, len, flags, index->offset); 349 350 /* skip data */ 350 351 stream_skip(demuxer->stream, len-12); … … 392 393 int num_of_packets = 0; 393 394 int i, entries = 0; 394 int len, stream_id = 0, timestamp, flags; 395 int len, stream_id = 0, flags; 396 unsigned int timestamp; 395 397 int tab_pos = 0; 396 398 … … 502 504 #define SHOW_BITS(n) ((buffer)>>(32-(n))) 503 505 504 static float real_fix_timestamp(real_priv_t* priv, unsigned char* s, int timestamp, floatframetime, unsigned int format){505 floatv_pts;506 static double real_fix_timestamp(real_priv_t* priv, unsigned char* s, unsigned int timestamp, double frametime, unsigned int format){ 507 double v_pts; 506 508 uint32_t buffer= (s[0]<<24) + (s[1]<<16) + (s[2]<<8) + s[3]; 507 int kf=timestamp;509 unsigned int kf=timestamp; 508 510 int pict_type; 509 int orig_kf;511 unsigned int orig_kf; 510 512 511 513 #if 1 … … 532 534 } else { 533 535 // P/B frame, merge timestamps: 534 int tmp=timestamp-priv->kf_base;536 int64_t tmp=(int64_t)timestamp-priv->kf_base; 535 537 kf|=tmp&(~0x1fff); // combine with packet timestamp 536 538 if(kf<tmp-4096) kf+=8192; else // workaround wrap-around problems … … 539 541 } 540 542 if(pict_type != 3){ // P || I frame -> swap timestamps 541 int tmp=kf;543 unsigned int tmp=kf; 542 544 kf=priv->kf_pts; 543 545 priv->kf_pts=tmp; 544 546 // if(kf<=tmp) kf=0; 545 547 } 546 if(verbose>1) printf("\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5d\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],kf-(int)(1000.0*priv->v_pts));548 dprintf("\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5u\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],kf-(unsigned int)(1000.0*priv->v_pts)); 547 549 } 548 550 #endif … … 568 570 demux_stream_t *ds = NULL; 569 571 int len; 570 int timestamp;572 unsigned int timestamp; 571 573 int stream_id; 572 574 #ifdef CRACK_MATRIX … … 650 652 651 653 dprintf("len:%d\n", len); 652 dprintf("\npacket#%d: pos: 0x%0x, len: %d, id: %d, pts: % d, flags: %x rvd:%d\n",654 dprintf("\npacket#%d: pos: 0x%0x, len: %d, id: %d, pts: %u, flags: %x rvd:%d\n", 653 655 priv->current_packet, (int)demuxer->filepos, len, stream_id, timestamp, flags, reserved); 654 656 … … 1060 1062 demuxer->audio->sh=sh; 1061 1063 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); 1062 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof( float));1064 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); 1063 1065 dprintf("Auto-selected RM audio ID = %d\n",stream_id); 1064 1066 goto got_audio; … … 1482 1484 demuxer->audio->sh=sh; 1483 1485 priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]); 1484 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof( float));1486 priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double)); 1485 1487 } 1486 1488 … … 1836 1838 int vid = d_video->id, aid = d_audio->id; 1837 1839 int next_offset = 0; 1838 int cur_timestamp = 0;1840 int64_t cur_timestamp = 0; 1839 1841 int streams = 0; 1840 1842 int retried = 0; … … 1920 1922 { 1921 1923 real_priv_t *priv = demuxer->priv; 1922 int lastpts = priv->v_pts ? priv->v_pts : priv->a_pts;1924 unsigned int lastpts = priv->v_pts ? priv->v_pts : priv->a_pts; 1923 1925 1924 1926 switch (cmd) {
Note:
See TracChangeset
for help on using the changeset viewer.