comparison utils.c @ 2297:acdc747b9ff3 libavformat

move code which adds a AVPacket into the packet buffer into its own function
author michael
date Fri, 03 Aug 2007 08:56:00 +0000
parents 09176aa7014c
children 9c8cfadff191
comparison
equal deleted inserted replaced
2296:0cfc556604e3 2297:acdc747b9ff3
811 pkt->size); 811 pkt->size);
812 812
813 return 0; 813 return 0;
814 } 814 }
815 815
816 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
817 AVPacketList *pktl= s->packet_buffer;
818 AVPacketList **plast_pktl= &s->packet_buffer;
819
820 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
821
822 pktl = av_mallocz(sizeof(AVPacketList));
823 if (!pktl)
824 return NULL;
825
826 /* add the packet in the buffered packet list */
827 *plast_pktl = pktl;
828 pktl->pkt= *pkt;
829 return &pktl->pkt;
830 }
831
816 int av_read_frame(AVFormatContext *s, AVPacket *pkt) 832 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
817 { 833 {
818 AVPacketList *pktl; 834 AVPacketList *pktl;
819 int eof=0; 835 int eof=0;
820 const int genpts= s->flags & AVFMT_FLAG_GENPTS; 836 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
846 av_free(pktl); 862 av_free(pktl);
847 return 0; 863 return 0;
848 } 864 }
849 } 865 }
850 if(genpts){ 866 if(genpts){
851 AVPacketList **plast_pktl= &s->packet_buffer;
852 int ret= av_read_frame_internal(s, pkt); 867 int ret= av_read_frame_internal(s, pkt);
853 if(ret<0){ 868 if(ret<0){
854 if(pktl && ret != AVERROR(EAGAIN)){ 869 if(pktl && ret != AVERROR(EAGAIN)){
855 eof=1; 870 eof=1;
856 continue; 871 continue;
857 }else 872 }else
858 return ret; 873 return ret;
859 } 874 }
860 875
861 /* duplicate the packet */ 876 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
862 if (av_dup_packet(pkt) < 0)
863 return AVERROR(ENOMEM); 877 return AVERROR(ENOMEM);
864
865 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
866
867 pktl = av_mallocz(sizeof(AVPacketList));
868 if (!pktl)
869 return AVERROR(ENOMEM);
870
871 /* add the packet in the buffered packet list */
872 *plast_pktl = pktl;
873 pktl->pkt= *pkt;
874 }else{ 878 }else{
875 assert(!s->packet_buffer); 879 assert(!s->packet_buffer);
876 return av_read_frame_internal(s, pkt); 880 return av_read_frame_internal(s, pkt);
877 } 881 }
878 } 882 }
1710 int av_find_stream_info(AVFormatContext *ic) 1714 int av_find_stream_info(AVFormatContext *ic)
1711 { 1715 {
1712 int i, count, ret, read_size, j; 1716 int i, count, ret, read_size, j;
1713 AVStream *st; 1717 AVStream *st;
1714 AVPacket pkt1, *pkt; 1718 AVPacket pkt1, *pkt;
1715 AVPacketList *pktl=NULL, **ppktl;
1716 int64_t last_dts[MAX_STREAMS]; 1719 int64_t last_dts[MAX_STREAMS];
1717 int duration_count[MAX_STREAMS]={0}; 1720 int duration_count[MAX_STREAMS]={0};
1718 double (*duration_error)[MAX_STD_TIMEBASES]; 1721 double (*duration_error)[MAX_STD_TIMEBASES];
1719 offset_t old_offset = url_ftell(&ic->pb); 1722 offset_t old_offset = url_ftell(&ic->pb);
1720 int64_t codec_info_duration[MAX_STREAMS]={0}; 1723 int64_t codec_info_duration[MAX_STREAMS]={0};
1747 } 1750 }
1748 1751
1749 memset(probe_data, 0, sizeof(probe_data)); 1752 memset(probe_data, 0, sizeof(probe_data));
1750 count = 0; 1753 count = 0;
1751 read_size = 0; 1754 read_size = 0;
1752 ppktl = &ic->packet_buffer;
1753 for(;;) { 1755 for(;;) {
1754 /* check if one codec still needs to be handled */ 1756 /* check if one codec still needs to be handled */
1755 for(i=0;i<ic->nb_streams;i++) { 1757 for(i=0;i<ic->nb_streams;i++) {
1756 st = ic->streams[i]; 1758 st = ic->streams[i];
1757 if (!has_codec_parameters(st->codec)) 1759 if (!has_codec_parameters(st->codec))
1799 } 1801 }
1800 } 1802 }
1801 break; 1803 break;
1802 } 1804 }
1803 1805
1804 pktl = av_mallocz(sizeof(AVPacketList)); 1806 pkt= add_to_pktbuf(ic, &pkt1);
1805 if (!pktl) { 1807 if(av_dup_packet(pkt) < 0)
1806 ret = AVERROR(ENOMEM); 1808 return AVERROR(ENOMEM);
1807 break;
1808 }
1809
1810 /* add the packet in the buffered packet list */
1811 *ppktl = pktl;
1812 ppktl = &pktl->next;
1813
1814 pkt = &pktl->pkt;
1815 *pkt = pkt1;
1816
1817 /* duplicate the packet */
1818 if (av_dup_packet(pkt) < 0) {
1819 ret = AVERROR(ENOMEM);
1820 break;
1821 }
1822 1809
1823 read_size += pkt->size; 1810 read_size += pkt->size;
1824 1811
1825 st = ic->streams[pkt->stream_index]; 1812 st = ic->streams[pkt->stream_index];
1826 if(codec_info_nb_frames[st->index]>1) 1813 if(codec_info_nb_frames[st->index]>1)