Changeset 254


Ignore:
Timestamp:
Oct 10, 2006, 9:02:55 PM (18 years ago)
Author:
vladest
Message:

Added missed files
Deleted unneeded files
Fixed timestamps in real streams

Location:
trunk
Files:
2 added
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/libmpdemux/demux_mkv.c

    r248 r254  
    267267extern int demux_aid_vid_mismatch;
    268268
     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 */
     275static void grow_array(void **array, int nelem, size_t elsize) {
     276    if (!(nelem & 31))
     277        *array = realloc(*array, (nelem + 32) * elsize);
     278}
    269279
    270280static mkv_track_t *
     
    310320            return;
    311321
    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));
    318324    mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position;
    319325}
     
    698704}
    699705
     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 */
     711static void
     712demux_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
    700719static int
    701720demux_mkv_read_trackencodings (demuxer_t *demuxer, mkv_track_t *track)
     
    736755                        num = ebml_read_uint (s, &l);
    737756                        if (num == EBML_UINT_INVALID)
    738                             return 0;
     757                            goto err_out;
    739758                        e.order = num;
    740759                        break;
     
    743762                        num = ebml_read_uint (s, &l);
    744763                        if (num == EBML_UINT_INVALID)
    745                             return 0;
     764                            goto err_out;
    746765                        e.scope = num;
    747766                        break;
     
    750769                        num = ebml_read_uint (s, &l);
    751770                        if (num == EBML_UINT_INVALID)
    752                             return 0;
     771                            goto err_out;
    753772                        e.type = num;
    754773                        break;
     
    771790                                    num = ebml_read_uint (s, &l);
    772791                                    if (num == EBML_UINT_INVALID)
    773                                         return 0;
     792                                        goto err_out;
    774793                                    e.comp_algo = num;
    775794                                    break;
     
    853872    track->num_encodings = n;
    854873    return len;
     874
     875err_out:
     876    demux_mkv_free_encodings(ce, n);
     877    return 0;
    855878}
    856879
     
    9921015}
    9931016
     1017/**
     1018 * \brief free any data associated with given track
     1019 * \param track track of which to free data
     1020 */
     1021static void
     1022demux_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
    9941043static int
    9951044demux_mkv_read_trackentry (demuxer_t *demuxer)
     
    10171066                uint64_t num = ebml_read_uint (s, &l);
    10181067                if (num == EBML_UINT_INVALID)
    1019                     return 0;
     1068                    goto err_out;
    10201069                track->tnum = num;
    10211070                dprintf ("[mkv] |  + Track number: %u\n",
     
    10531102            l = demux_mkv_read_trackaudio (demuxer, track);
    10541103            if (l == 0)
    1055                 return 0;
     1104                goto err_out;
    10561105            break;
    10571106
     
    10601109            l = demux_mkv_read_trackvideo (demuxer, track);
    10611110            if (l == 0)
    1062                 return 0;
     1111                goto err_out;
    10631112            break;
    10641113
     
    10661115            track->codec_id = ebml_read_ascii (s, &l);
    10671116            if (track->codec_id == NULL)
    1068                 return 0;
     1117                goto err_out;
    10691118            if (!strcmp (track->codec_id, MKV_V_MSCOMP) ||
    10701119                !strcmp (track->codec_id, MKV_A_ACM))
     
    10981147                track->private_data = malloc (num);
    10991148                if (stream_read(s, track->private_data, num) != (int) num)
    1100                     return 0;
     1149                    goto err_out;
    11011150                track->private_size = num;
    11021151                dprintf ("[mkv] |  + CodecPrivate, length "
     
    11061155
    11071156        case MATROSKA_ID_TRACKLANGUAGE:
     1157            free(track->language);
    11081158            track->language = ebml_read_utf8 (s, &l);
    11091159            if (track->language == NULL)
    1110                 return 0;
     1160                goto err_out;
    11111161            dprintf ("[mkv] |  + Language: %s\n",
    11121162                     track->language);
     
    11171167                uint64_t num = ebml_read_uint (s, &l);
    11181168                if (num == EBML_UINT_INVALID)
    1119                     return 0;
     1169                    goto err_out;
    11201170                track->default_track = num;
    11211171                dprintf ("[mkv] |  + Default flag: %u\n",
     
    11281178                uint64_t num = ebml_read_uint (s, &l);
    11291179                if (num == EBML_UINT_INVALID)
    1130                     return 0;
     1180                    goto err_out;
    11311181                if (num == 0)
    11321182                    dprintf ("[mkv] |  + Default duration: 0");
     
    11441194            l = demux_mkv_read_trackencodings (demuxer, track);
    11451195            if (l == 0)
    1146                 return 0;
     1196                goto err_out;
    11471197            break;
    11481198
     
    11561206    mkv_d->tracks[mkv_d->num_tracks++] = track;
    11571207    return len;
     1208
     1209err_out:
     1210    demux_mkv_free_trackentry(track);
     1211    return 0;
    11581212}
    11591213
     
    12911345            && pos != EBML_UINT_INVALID)
    12921346        {
    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));
    12991348            mkv_d->indexes[mkv_d->num_indexes].tnum = track;
    13001349            mkv_d->indexes[mkv_d->num_indexes].timecode = time;
     
    24862535        {
    24872536            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]);
    25002538            for (i=0; i < SUB_MAX_TEXT; i++)
    25012539                if (mkv_d->subs.text[i])
  • TabularUnified trunk/libmpdemux/demux_real.c

    r247 r254  
    6969extern int verbose;
    7070typedef struct {
    71     int         timestamp;
     71    unsigned int        timestamp;
    7272    int         offset;
    7373    //    int           packetno;
     
    9494
    9595    // timestamp correction:
    96     int         kf_base;// timestamp of the prev. video keyframe
    97     int         kf_pts; // timestamp of next video keyframe
    98     int         a_pts;  // previous audio timestamp
    99     float       v_pts;  // previous video timestamp
     96    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
    100100    unsigned long duration;
    101101
     
    128128    int audiopk_size[MAX_STREAMS]; ///< audio packet size
    129129    unsigned char *audio_buf; ///< place to store reordered audio data
    130     float *audio_timestamp; ///< timestamp for each audio packet
     130    double *audio_timestamp; ///< timestamp for each audio packet
    131131    int sub_packet_cnt; ///< number of subpacket already received
    132132    int audio_filepos; ///< file position of first audio packet in block
     
    187187    {
    188188#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);
    190190#else
    191191        dprintf("packetno: %x pos: %x len: %x timestamp: %x flags: %x\n",
     
    275275
    276276#if 1
    277 static void add_index_item(demuxer_t *demuxer, int stream_id, int timestamp, int offset)
     277static void add_index_item(demuxer_t *demuxer, int stream_id, unsigned int timestamp, int offset)
    278278{
    279279    if ((unsigned)stream_id < MAX_STREAMS)
     
    310310}
    311311
    312 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int seek_timestamp)
     312static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int64_t seek_timestamp)
    313313{
    314     int tag, len, stream_id, timestamp, flags;
     314    int tag, len, stream_id, flags;
     315    unsigned int timestamp;
    315316    if (seek_timestamp != -1 && (unsigned)seek_stream_id >= MAX_STREAMS)
    316317        return;
     
    346347            }
    347348        }
    348         // printf("Index: stream=%d packet=%d timestamp=%d len=%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);
    349350        /* skip data */
    350351        stream_skip(demuxer->stream, len-12);
     
    392393    int num_of_packets = 0;
    393394    int i, entries = 0;
    394     int len, stream_id = 0, timestamp, flags;
     395    int len, stream_id = 0, flags;
     396    unsigned int timestamp;
    395397    int tab_pos = 0;
    396398
     
    502504#define SHOW_BITS(n) ((buffer)>>(32-(n)))
    503505
    504 static float real_fix_timestamp(real_priv_t* priv, unsigned char* s, int timestamp, float frametime, unsigned int format){
    505     float v_pts;
     506static double real_fix_timestamp(real_priv_t* priv, unsigned char* s, unsigned int timestamp, double frametime, unsigned int format){
     507    double v_pts;
    506508    uint32_t buffer= (s[0]<<24) + (s[1]<<16) + (s[2]<<8) + s[3];
    507     int kf=timestamp;
     509    unsigned int kf=timestamp;
    508510    int pict_type;
    509     int orig_kf;
     511    unsigned int orig_kf;
    510512
    511513#if 1
     
    532534        } else {
    533535            // P/B frame, merge timestamps:
    534             int tmp=timestamp-priv->kf_base;
     536            int64_t tmp=(int64_t)timestamp-priv->kf_base;
    535537            kf|=tmp&(~0x1fff);        // combine with packet timestamp
    536538            if(kf<tmp-4096) kf+=8192; else // workaround wrap-around problems
     
    539541        }
    540542        if(pict_type != 3){ // P || I  frame -> swap timestamps
    541             int tmp=kf;
     543            unsigned int tmp=kf;
    542544            kf=priv->kf_pts;
    543545            priv->kf_pts=tmp;
    544546            //  if(kf<=tmp) kf=0;
    545547        }
    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));
    547549    }
    548550#endif
     
    568570    demux_stream_t *ds = NULL;
    569571    int len;
    570     int timestamp;
     572    unsigned int timestamp;
    571573    int stream_id;
    572574#ifdef CRACK_MATRIX
     
    650652
    651653        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",
    653655                priv->current_packet, (int)demuxer->filepos, len, stream_id, timestamp, flags, reserved);
    654656
     
    10601062                demuxer->audio->sh=sh;
    10611063                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));
    10631065                dprintf("Auto-selected RM audio ID = %d\n",stream_id);
    10641066                goto got_audio;
     
    14821484                                demuxer->audio->sh=sh;
    14831485                                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));
    14851487                            }
    14861488
     
    18361838    int vid = d_video->id, aid = d_audio->id;
    18371839    int next_offset = 0;
    1838     int cur_timestamp = 0;
     1840    int64_t cur_timestamp = 0;
    18391841    int streams = 0;
    18401842    int retried = 0;
     
    19201922{
    19211923    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;
    19231925
    19241926    switch (cmd) {
Note: See TracChangeset for help on using the changeset viewer.