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){