Mercurial > libavformat.hg
comparison flvdec.c @ 445:c1f88671135b libavformat
cleanup
fix streamcopy
author | michael |
---|---|
date | Sat, 17 Apr 2004 12:04:59 +0000 |
parents | abd83fc30f0e |
children | b69898ffc92a |
comparison
equal
deleted
inserted
replaced
444:d42038d418a0 | 445:c1f88671135b |
---|---|
38 return 50; | 38 return 50; |
39 } | 39 } |
40 return 0; | 40 return 0; |
41 } | 41 } |
42 | 42 |
43 #define FRAME_RATE_UNKNOWN 31415 //yes i know its beatifull | |
44 | |
45 static int flv_read_header(AVFormatContext *s, | 43 static int flv_read_header(AVFormatContext *s, |
46 AVFormatParameters *ap) | 44 AVFormatParameters *ap) |
47 { | 45 { |
48 int offset, flags; | 46 int offset, flags; |
49 AVStream *st; | 47 AVStream *st; |
53 av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */ | 51 av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */ |
54 | 52 |
55 url_fskip(&s->pb, 4); | 53 url_fskip(&s->pb, 4); |
56 flags = get_byte(&s->pb); | 54 flags = get_byte(&s->pb); |
57 | 55 |
58 if ((flags & 1)) { | |
59 st = av_new_stream(s, 0); | |
60 if (!st) | |
61 return AVERROR_NOMEM; | |
62 st->codec.codec_type = CODEC_TYPE_VIDEO; | |
63 st->codec.codec_id = CODEC_ID_FLV1; | |
64 st->codec.frame_rate= FRAME_RATE_UNKNOWN; | |
65 // st->codec.frame_rate= ap->frame_rate; | |
66 // st->codec.frame_rate_base= ap->frame_rate_base; | |
67 } | |
68 | |
69 if ((flags & 4)) { | |
70 st = av_new_stream(s, 1); | |
71 if (!st) | |
72 return AVERROR_NOMEM; | |
73 st->codec.codec_type = CODEC_TYPE_AUDIO; | |
74 st->codec.codec_id = CODEC_ID_MP3; | |
75 } | |
76 | |
77 offset = get_be32(&s->pb); | 56 offset = get_be32(&s->pb); |
78 url_fseek(&s->pb, offset, SEEK_SET); | 57 url_fseek(&s->pb, offset, SEEK_SET); |
79 | 58 |
80 return 0; | 59 return 0; |
81 } | 60 } |
82 | 61 |
83 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) | 62 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) |
84 { | 63 { |
85 int ret, i, type, size, pts, flags; | 64 int ret, i, type, size, pts, flags, is_audio; |
86 AVStream *st; | 65 AVStream *st; |
87 | 66 |
88 redo: | 67 for(;;){ |
89 url_fskip(&s->pb, 4); /* size of previous packet */ | 68 url_fskip(&s->pb, 4); /* size of previous packet */ |
90 type = get_byte(&s->pb); | 69 type = get_byte(&s->pb); |
91 size = get_be24(&s->pb); | 70 size = get_be24(&s->pb); |
92 pts = get_be24(&s->pb); | 71 pts = get_be24(&s->pb); |
93 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts); | 72 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts); |
94 if (url_feof(&s->pb)) | 73 if (url_feof(&s->pb)) |
95 return -EIO; | 74 return -EIO; |
96 url_fskip(&s->pb, 4); /* reserved */ | 75 url_fskip(&s->pb, 4); /* reserved */ |
97 flags = 0; | 76 flags = 0; |
77 | |
78 if(size == 0) | |
79 continue; | |
80 | |
98 if (type == 8) { | 81 if (type == 8) { |
82 is_audio=1; | |
99 flags = get_byte(&s->pb); | 83 flags = get_byte(&s->pb); |
100 size--; | 84 size--; |
101 if ((flags >> 4) != 2) { /* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/ | |
102 goto skip; | |
103 } | |
104 } else if (type == 9) { | 85 } else if (type == 9) { |
86 is_audio=0; | |
105 flags = get_byte(&s->pb); | 87 flags = get_byte(&s->pb); |
106 size--; | 88 size--; |
107 if ((flags & 0xF) != 2) { /* 2: only format */ | |
108 goto skip; | |
109 } | |
110 } else { | 89 } else { |
111 skip: | |
112 /* skip packet */ | 90 /* skip packet */ |
113 av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags); | 91 av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags); |
114 url_fskip(&s->pb, size); | 92 url_fskip(&s->pb, size); |
115 goto redo; | 93 continue; |
116 } | 94 } |
117 | 95 |
118 /* now find stream */ | 96 /* now find stream */ |
119 for(i=0;i<s->nb_streams;i++) { | 97 for(i=0;i<s->nb_streams;i++) { |
120 st = s->streams[i]; | 98 st = s->streams[i]; |
121 if (st->id == ((type == 9) ? 0 : 1)) | 99 if (st->id == is_audio) |
122 goto found; | 100 break; |
123 } | 101 } |
124 goto skip; | 102 if(i == s->nb_streams){ |
125 found: | 103 st = av_new_stream(s, is_audio); |
126 if(type == 8 && st->codec.sample_rate == 0){ | 104 if (!st) |
127 st->codec.channels = (flags&1)+1; | 105 return AVERROR_NOMEM; |
128 st->codec.sample_rate = (44100<<((flags>>2)&3))>>3; | 106 st->codec.frame_rate_base= 0; |
129 } | 107 } |
108 break; | |
109 } | |
130 | 110 |
131 //guess the frame rate | 111 if(is_audio){ |
132 if(type==9 && st->codec.frame_rate == FRAME_RATE_UNKNOWN && pts){ | 112 if(st->codec.sample_rate == 0){ |
133 st->codec.frame_rate_base=1; | 113 st->codec.codec_type = CODEC_TYPE_AUDIO; |
134 st->codec.frame_rate= (1000 + pts/2)/pts; | 114 st->codec.channels = (flags&1)+1; |
115 if((flags >> 4) == 5) | |
116 st->codec.sample_rate= 8000; | |
117 else | |
118 st->codec.sample_rate = (44100<<((flags>>2)&3))>>3; | |
119 switch(flags >> 4){/* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/ | |
120 case 2: st->codec.codec_id = CODEC_ID_MP3; break; | |
121 default: | |
122 st->codec.codec_tag= (flags >> 4); | |
123 } | |
124 } | |
125 }else{ | |
126 if(st->codec.frame_rate_base == 0){ | |
127 st->codec.codec_type = CODEC_TYPE_VIDEO; | |
128 //guess the frame rate | |
129 if(pts){ | |
130 st->codec.frame_rate_base=1; | |
131 st->codec.frame_rate= (1000 + pts/2)/pts; | |
132 } | |
133 switch(flags & 0xF){ | |
134 case 2: st->codec.codec_id = CODEC_ID_FLV1; break; | |
135 default: | |
136 st->codec.codec_tag= flags & 0xF; | |
137 } | |
138 } | |
135 } | 139 } |
136 | 140 |
137 if (av_new_packet(pkt, size) < 0) | 141 if (av_new_packet(pkt, size) < 0) |
138 return -EIO; | 142 return -EIO; |
139 | 143 |