Mercurial > libavformat.hg
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) |