Mercurial > libavformat.hg
comparison utils.c @ 4309:24450a206efa libavformat
split av_interleave_per_dts, to avoid code duplication
author | bcoudurier |
---|---|
date | Sat, 31 Jan 2009 06:01:58 +0000 |
parents | ed5196e6e112 |
children | 6957efa06a1b |
comparison
equal
deleted
inserted
replaced
4308:dda76da5252d | 4309:24450a206efa |
---|---|
2583 if(!ret) | 2583 if(!ret) |
2584 ret= url_ferror(s->pb); | 2584 ret= url_ferror(s->pb); |
2585 return ret; | 2585 return ret; |
2586 } | 2586 } |
2587 | 2587 |
2588 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, | |
2589 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *)) | |
2590 { | |
2591 AVPacketList **next_point, *this_pktl; | |
2592 | |
2593 this_pktl = av_mallocz(sizeof(AVPacketList)); | |
2594 this_pktl->pkt= *pkt; | |
2595 if(pkt->destruct == av_destruct_packet) | |
2596 pkt->destruct= NULL; // not shared -> must keep original from being freed | |
2597 else | |
2598 av_dup_packet(&this_pktl->pkt); //shared -> must dup | |
2599 | |
2600 next_point = &s->packet_buffer; | |
2601 while(*next_point){ | |
2602 if(compare(s, &(*next_point)->pkt, pkt)) | |
2603 break; | |
2604 next_point= &(*next_point)->next; | |
2605 } | |
2606 this_pktl->next= *next_point; | |
2607 *next_point= this_pktl; | |
2608 } | |
2609 | |
2610 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt) | |
2611 { | |
2612 AVStream *st = s->streams[ pkt ->stream_index]; | |
2613 AVStream *st2= s->streams[ next->stream_index]; | |
2614 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den; | |
2615 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den; | |
2616 | |
2617 return next->dts * left > pkt->dts * right; //FIXME this can overflow | |
2618 } | |
2619 | |
2588 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){ | 2620 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){ |
2589 AVPacketList *pktl, **next_point, *this_pktl; | 2621 AVPacketList *pktl; |
2590 int stream_count=0; | 2622 int stream_count=0; |
2591 int streams[MAX_STREAMS]; | 2623 int streams[MAX_STREAMS]; |
2592 | 2624 |
2593 if(pkt){ | 2625 if(pkt){ |
2594 AVStream *st= s->streams[ pkt->stream_index]; | 2626 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts); |
2595 | |
2596 // assert(pkt->destruct != av_destruct_packet); //FIXME | |
2597 | |
2598 this_pktl = av_mallocz(sizeof(AVPacketList)); | |
2599 this_pktl->pkt= *pkt; | |
2600 if(pkt->destruct == av_destruct_packet) | |
2601 pkt->destruct= NULL; // not shared -> must keep original from being freed | |
2602 else | |
2603 av_dup_packet(&this_pktl->pkt); //shared -> must dup | |
2604 | |
2605 next_point = &s->packet_buffer; | |
2606 while(*next_point){ | |
2607 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index]; | |
2608 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den; | |
2609 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den; | |
2610 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow | |
2611 break; | |
2612 next_point= &(*next_point)->next; | |
2613 } | |
2614 this_pktl->next= *next_point; | |
2615 *next_point= this_pktl; | |
2616 } | 2627 } |
2617 | 2628 |
2618 memset(streams, 0, sizeof(streams)); | 2629 memset(streams, 0, sizeof(streams)); |
2619 pktl= s->packet_buffer; | 2630 pktl= s->packet_buffer; |
2620 while(pktl){ | 2631 while(pktl){ |