* commit '0d1229f1d2b8f26dd50c6be7917bb8ed8cb95364':
voc: Split ff_voc_get_packet into a separate file
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
... | ... |
@@ -104,7 +104,7 @@ OBJS-$(CONFIG_AVI_MUXER) += avienc.o mpegtsenc.o avlanguage.o ra |
104 | 104 |
OBJS-$(CONFIG_AVISYNTH) += avisynth.o |
105 | 105 |
OBJS-$(CONFIG_AVM2_MUXER) += swfenc.o swf.o |
106 | 106 |
OBJS-$(CONFIG_AVR_DEMUXER) += avr.o pcm.o |
107 |
-OBJS-$(CONFIG_AVS_DEMUXER) += avs.o vocdec.o voc.o |
|
107 |
+OBJS-$(CONFIG_AVS_DEMUXER) += avs.o voc_packet.o vocdec.o voc.o |
|
108 | 108 |
OBJS-$(CONFIG_BETHSOFTVID_DEMUXER) += bethsoftvid.o |
109 | 109 |
OBJS-$(CONFIG_BFI_DEMUXER) += bfi.o |
110 | 110 |
OBJS-$(CONFIG_BINK_DEMUXER) += bink.o |
... | ... |
@@ -115,7 +115,7 @@ OBJS-$(CONFIG_BMV_DEMUXER) += bmv.o |
115 | 115 |
OBJS-$(CONFIG_BOA_DEMUXER) += boadec.o |
116 | 116 |
OBJS-$(CONFIG_BFSTM_DEMUXER) += brstm.o |
117 | 117 |
OBJS-$(CONFIG_BRSTM_DEMUXER) += brstm.o |
118 |
-OBJS-$(CONFIG_C93_DEMUXER) += c93.o vocdec.o voc.o |
|
118 |
+OBJS-$(CONFIG_C93_DEMUXER) += c93.o voc_packet.o vocdec.o voc.o |
|
119 | 119 |
OBJS-$(CONFIG_CAF_DEMUXER) += cafdec.o caf.o mov.o mov_chan.o \ |
120 | 120 |
replaygain.o |
121 | 121 |
OBJS-$(CONFIG_CAF_MUXER) += cafenc.o caf.o riff.o isom.o |
... | ... |
@@ -463,7 +463,7 @@ OBJS-$(CONFIG_VC1T_MUXER) += vc1testenc.o |
463 | 463 |
OBJS-$(CONFIG_VIVO_DEMUXER) += vivo.o |
464 | 464 |
OBJS-$(CONFIG_VMD_DEMUXER) += sierravmd.o |
465 | 465 |
OBJS-$(CONFIG_VOBSUB_DEMUXER) += subtitles.o # mpeg demuxer is in the dependencies |
466 |
-OBJS-$(CONFIG_VOC_DEMUXER) += vocdec.o voc.o |
|
466 |
+OBJS-$(CONFIG_VOC_DEMUXER) += vocdec.o voc_packet.o voc.o |
|
467 | 467 |
OBJS-$(CONFIG_VOC_MUXER) += vocenc.o voc.o |
468 | 468 |
OBJS-$(CONFIG_VPK_DEMUXER) += vpk.o |
469 | 469 |
OBJS-$(CONFIG_VPLAYER_DEMUXER) += vplayerdec.o subtitles.o |
470 | 470 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,141 @@ |
0 |
+/* |
|
1 |
+ * Copyright (c) 2006 Aurelien Jacobs <aurel@gnuage.org> |
|
2 |
+ * |
|
3 |
+ * This file is part of FFmpeg. |
|
4 |
+ * |
|
5 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
6 |
+ * modify it under the terms of the GNU Lesser General Public |
|
7 |
+ * License as published by the Free Software Foundation; either |
|
8 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
9 |
+ * |
|
10 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
11 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 |
+ * Lesser General Public License for more details. |
|
14 |
+ * |
|
15 |
+ * You should have received a copy of the GNU Lesser General Public |
|
16 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
17 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
18 |
+ */ |
|
19 |
+ |
|
20 |
+#include "libavutil/intreadwrite.h" |
|
21 |
+#include "avformat.h" |
|
22 |
+#include "internal.h" |
|
23 |
+#include "voc.h" |
|
24 |
+ |
|
25 |
+int |
|
26 |
+ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) |
|
27 |
+{ |
|
28 |
+ VocDecContext *voc = s->priv_data; |
|
29 |
+ AVCodecContext *dec = st->codec; |
|
30 |
+ AVIOContext *pb = s->pb; |
|
31 |
+ VocType type; |
|
32 |
+ int size, tmp_codec=-1; |
|
33 |
+ int sample_rate = 0; |
|
34 |
+ int channels = 1; |
|
35 |
+ int64_t duration; |
|
36 |
+ int ret; |
|
37 |
+ |
|
38 |
+ av_add_index_entry(st, |
|
39 |
+ avio_tell(pb), |
|
40 |
+ voc->pts, |
|
41 |
+ voc->remaining_size, |
|
42 |
+ 0, |
|
43 |
+ AVINDEX_KEYFRAME); |
|
44 |
+ |
|
45 |
+ while (!voc->remaining_size) { |
|
46 |
+ type = avio_r8(pb); |
|
47 |
+ if (type == VOC_TYPE_EOF) |
|
48 |
+ return AVERROR_EOF; |
|
49 |
+ voc->remaining_size = avio_rl24(pb); |
|
50 |
+ if (!voc->remaining_size) { |
|
51 |
+ if (!s->pb->seekable) |
|
52 |
+ return AVERROR(EIO); |
|
53 |
+ voc->remaining_size = avio_size(pb) - avio_tell(pb); |
|
54 |
+ } |
|
55 |
+ max_size -= 4; |
|
56 |
+ |
|
57 |
+ switch (type) { |
|
58 |
+ case VOC_TYPE_VOICE_DATA: |
|
59 |
+ if (!dec->sample_rate) { |
|
60 |
+ dec->sample_rate = 1000000 / (256 - avio_r8(pb)); |
|
61 |
+ if (sample_rate) |
|
62 |
+ dec->sample_rate = sample_rate; |
|
63 |
+ avpriv_set_pts_info(st, 64, 1, dec->sample_rate); |
|
64 |
+ dec->channels = channels; |
|
65 |
+ dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id); |
|
66 |
+ } else |
|
67 |
+ avio_skip(pb, 1); |
|
68 |
+ tmp_codec = avio_r8(pb); |
|
69 |
+ voc->remaining_size -= 2; |
|
70 |
+ max_size -= 2; |
|
71 |
+ channels = 1; |
|
72 |
+ break; |
|
73 |
+ |
|
74 |
+ case VOC_TYPE_VOICE_DATA_CONT: |
|
75 |
+ break; |
|
76 |
+ |
|
77 |
+ case VOC_TYPE_EXTENDED: |
|
78 |
+ sample_rate = avio_rl16(pb); |
|
79 |
+ avio_r8(pb); |
|
80 |
+ channels = avio_r8(pb) + 1; |
|
81 |
+ sample_rate = 256000000 / (channels * (65536 - sample_rate)); |
|
82 |
+ voc->remaining_size = 0; |
|
83 |
+ max_size -= 4; |
|
84 |
+ break; |
|
85 |
+ |
|
86 |
+ case VOC_TYPE_NEW_VOICE_DATA: |
|
87 |
+ if (!dec->sample_rate) { |
|
88 |
+ dec->sample_rate = avio_rl32(pb); |
|
89 |
+ avpriv_set_pts_info(st, 64, 1, dec->sample_rate); |
|
90 |
+ dec->bits_per_coded_sample = avio_r8(pb); |
|
91 |
+ dec->channels = avio_r8(pb); |
|
92 |
+ } else |
|
93 |
+ avio_skip(pb, 6); |
|
94 |
+ tmp_codec = avio_rl16(pb); |
|
95 |
+ avio_skip(pb, 4); |
|
96 |
+ voc->remaining_size -= 12; |
|
97 |
+ max_size -= 12; |
|
98 |
+ break; |
|
99 |
+ |
|
100 |
+ default: |
|
101 |
+ avio_skip(pb, voc->remaining_size); |
|
102 |
+ max_size -= voc->remaining_size; |
|
103 |
+ voc->remaining_size = 0; |
|
104 |
+ break; |
|
105 |
+ } |
|
106 |
+ } |
|
107 |
+ |
|
108 |
+ if (tmp_codec >= 0) { |
|
109 |
+ tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec); |
|
110 |
+ if (dec->codec_id == AV_CODEC_ID_NONE) |
|
111 |
+ dec->codec_id = tmp_codec; |
|
112 |
+ else if (dec->codec_id != tmp_codec) |
|
113 |
+ av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n"); |
|
114 |
+ if (dec->codec_id == AV_CODEC_ID_NONE) { |
|
115 |
+ if (s->audio_codec_id == AV_CODEC_ID_NONE) { |
|
116 |
+ av_log(s, AV_LOG_ERROR, "unknown codec tag\n"); |
|
117 |
+ return AVERROR(EINVAL); |
|
118 |
+ } |
|
119 |
+ av_log(s, AV_LOG_WARNING, "unknown codec tag\n"); |
|
120 |
+ } |
|
121 |
+ } |
|
122 |
+ |
|
123 |
+ dec->bit_rate = dec->sample_rate * dec->channels * dec->bits_per_coded_sample; |
|
124 |
+ |
|
125 |
+ if (max_size <= 0) |
|
126 |
+ max_size = 2048; |
|
127 |
+ size = FFMIN(voc->remaining_size, max_size); |
|
128 |
+ voc->remaining_size -= size; |
|
129 |
+ |
|
130 |
+ ret = av_get_packet(pb, pkt, size); |
|
131 |
+ pkt->dts = pkt->pts = voc->pts; |
|
132 |
+ |
|
133 |
+ duration = av_get_audio_frame_duration(st->codec, size); |
|
134 |
+ if (duration > 0 && voc->pts != AV_NOPTS_VALUE) |
|
135 |
+ voc->pts += duration; |
|
136 |
+ else |
|
137 |
+ voc->pts = AV_NOPTS_VALUE; |
|
138 |
+ |
|
139 |
+ return ret; |
|
140 |
+} |
... | ... |
@@ -23,124 +23,6 @@ |
23 | 23 |
#include "voc.h" |
24 | 24 |
#include "internal.h" |
25 | 25 |
|
26 |
-int |
|
27 |
-ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) |
|
28 |
-{ |
|
29 |
- VocDecContext *voc = s->priv_data; |
|
30 |
- AVCodecContext *dec = st->codec; |
|
31 |
- AVIOContext *pb = s->pb; |
|
32 |
- VocType type; |
|
33 |
- int size, tmp_codec=-1; |
|
34 |
- int sample_rate = 0; |
|
35 |
- int channels = 1; |
|
36 |
- int64_t duration; |
|
37 |
- int ret; |
|
38 |
- |
|
39 |
- av_add_index_entry(st, |
|
40 |
- avio_tell(pb), |
|
41 |
- voc->pts, |
|
42 |
- voc->remaining_size, |
|
43 |
- 0, |
|
44 |
- AVINDEX_KEYFRAME); |
|
45 |
- |
|
46 |
- while (!voc->remaining_size) { |
|
47 |
- type = avio_r8(pb); |
|
48 |
- if (type == VOC_TYPE_EOF) |
|
49 |
- return AVERROR_EOF; |
|
50 |
- voc->remaining_size = avio_rl24(pb); |
|
51 |
- if (!voc->remaining_size) { |
|
52 |
- if (!s->pb->seekable) |
|
53 |
- return AVERROR(EIO); |
|
54 |
- voc->remaining_size = avio_size(pb) - avio_tell(pb); |
|
55 |
- } |
|
56 |
- max_size -= 4; |
|
57 |
- |
|
58 |
- switch (type) { |
|
59 |
- case VOC_TYPE_VOICE_DATA: |
|
60 |
- if (!dec->sample_rate) { |
|
61 |
- dec->sample_rate = 1000000 / (256 - avio_r8(pb)); |
|
62 |
- if (sample_rate) |
|
63 |
- dec->sample_rate = sample_rate; |
|
64 |
- avpriv_set_pts_info(st, 64, 1, dec->sample_rate); |
|
65 |
- dec->channels = channels; |
|
66 |
- dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id); |
|
67 |
- } else |
|
68 |
- avio_skip(pb, 1); |
|
69 |
- tmp_codec = avio_r8(pb); |
|
70 |
- voc->remaining_size -= 2; |
|
71 |
- max_size -= 2; |
|
72 |
- channels = 1; |
|
73 |
- break; |
|
74 |
- |
|
75 |
- case VOC_TYPE_VOICE_DATA_CONT: |
|
76 |
- break; |
|
77 |
- |
|
78 |
- case VOC_TYPE_EXTENDED: |
|
79 |
- sample_rate = avio_rl16(pb); |
|
80 |
- avio_r8(pb); |
|
81 |
- channels = avio_r8(pb) + 1; |
|
82 |
- sample_rate = 256000000 / (channels * (65536 - sample_rate)); |
|
83 |
- voc->remaining_size = 0; |
|
84 |
- max_size -= 4; |
|
85 |
- break; |
|
86 |
- |
|
87 |
- case VOC_TYPE_NEW_VOICE_DATA: |
|
88 |
- if (!dec->sample_rate) { |
|
89 |
- dec->sample_rate = avio_rl32(pb); |
|
90 |
- avpriv_set_pts_info(st, 64, 1, dec->sample_rate); |
|
91 |
- dec->bits_per_coded_sample = avio_r8(pb); |
|
92 |
- dec->channels = avio_r8(pb); |
|
93 |
- } else |
|
94 |
- avio_skip(pb, 6); |
|
95 |
- tmp_codec = avio_rl16(pb); |
|
96 |
- avio_skip(pb, 4); |
|
97 |
- voc->remaining_size -= 12; |
|
98 |
- max_size -= 12; |
|
99 |
- break; |
|
100 |
- |
|
101 |
- default: |
|
102 |
- avio_skip(pb, voc->remaining_size); |
|
103 |
- max_size -= voc->remaining_size; |
|
104 |
- voc->remaining_size = 0; |
|
105 |
- break; |
|
106 |
- } |
|
107 |
- } |
|
108 |
- |
|
109 |
- if (tmp_codec >= 0) { |
|
110 |
- tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec); |
|
111 |
- if (dec->codec_id == AV_CODEC_ID_NONE) |
|
112 |
- dec->codec_id = tmp_codec; |
|
113 |
- else if (dec->codec_id != tmp_codec) |
|
114 |
- av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n"); |
|
115 |
- if (dec->codec_id == AV_CODEC_ID_NONE) { |
|
116 |
- if (s->audio_codec_id == AV_CODEC_ID_NONE) { |
|
117 |
- av_log(s, AV_LOG_ERROR, "unknown codec tag\n"); |
|
118 |
- return AVERROR(EINVAL); |
|
119 |
- } |
|
120 |
- av_log(s, AV_LOG_WARNING, "unknown codec tag\n"); |
|
121 |
- } |
|
122 |
- } |
|
123 |
- |
|
124 |
- dec->bit_rate = dec->sample_rate * dec->channels * dec->bits_per_coded_sample; |
|
125 |
- |
|
126 |
- if (max_size <= 0) |
|
127 |
- max_size = 2048; |
|
128 |
- size = FFMIN(voc->remaining_size, max_size); |
|
129 |
- voc->remaining_size -= size; |
|
130 |
- |
|
131 |
- ret = av_get_packet(pb, pkt, size); |
|
132 |
- pkt->dts = pkt->pts = voc->pts; |
|
133 |
- |
|
134 |
- duration = av_get_audio_frame_duration(st->codec, size); |
|
135 |
- if (duration > 0 && voc->pts != AV_NOPTS_VALUE) |
|
136 |
- voc->pts += duration; |
|
137 |
- else |
|
138 |
- voc->pts = AV_NOPTS_VALUE; |
|
139 |
- |
|
140 |
- return ret; |
|
141 |
-} |
|
142 |
- |
|
143 |
-#if CONFIG_VOC_DEMUXER |
|
144 | 26 |
static int voc_probe(AVProbeData *p) |
145 | 27 |
{ |
146 | 28 |
int version, check; |
... | ... |
@@ -215,4 +97,3 @@ AVInputFormat ff_voc_demuxer = { |
215 | 215 |
.read_seek = voc_read_seek, |
216 | 216 |
.codec_tag = (const AVCodecTag* const []){ ff_voc_codec_tags, 0 }, |
217 | 217 |
}; |
218 |
-#endif /* CONFIG_VOC_DEMUXER */ |