comparison raw.c @ 6445:4aaed59641ff libavformat

move pcm demuxers to their own file
author aurel
date Mon, 30 Aug 2010 21:17:34 +0000
parents 9a1a187b1de7
children 659a7e022950
comparison
equal deleted inserted replaced
6444:505f0bb17a5d 6445:4aaed59641ff
34 } 34 }
35 #endif 35 #endif
36 36
37 #if CONFIG_DEMUXERS 37 #if CONFIG_DEMUXERS
38 /* raw input */ 38 /* raw input */
39 static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) 39 int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
40 { 40 {
41 AVStream *st; 41 AVStream *st;
42 enum CodecID id; 42 enum CodecID id;
43 43
44 st = av_new_stream(s, 0); 44 st = av_new_stream(s, 0);
79 } 79 }
80 return 0; 80 return 0;
81 } 81 }
82 82
83 #define RAW_PACKET_SIZE 1024 83 #define RAW_PACKET_SIZE 1024
84 #define RAW_SAMPLES 1024
85
86 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
87 {
88 int ret, size, bps;
89 // AVStream *st = s->streams[0];
90
91 size= RAW_SAMPLES*s->streams[0]->codec->block_align;
92
93 ret= av_get_packet(s->pb, pkt, size);
94
95 pkt->stream_index = 0;
96 if (ret < 0)
97 return ret;
98
99 bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
100 assert(bps); // if false there IS a bug elsewhere (NOT in this function)
101 pkt->dts=
102 pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
103
104 return ret;
105 }
106 84
107 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) 85 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
108 { 86 {
109 int ret, size; 87 int ret, size;
110 88
148 return 0; 126 return 0;
149 } 127 }
150 #endif 128 #endif
151 129
152 #if CONFIG_DEMUXERS 130 #if CONFIG_DEMUXERS
153 int pcm_read_seek(AVFormatContext *s,
154 int stream_index, int64_t timestamp, int flags)
155 {
156 AVStream *st;
157 int block_align, byte_rate;
158 int64_t pos, ret;
159
160 st = s->streams[0];
161
162 block_align = st->codec->block_align ? st->codec->block_align :
163 (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
164 byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
165 block_align * st->codec->sample_rate;
166
167 if (block_align <= 0 || byte_rate <= 0)
168 return -1;
169 if (timestamp < 0) timestamp = 0;
170
171 /* compute the position by aligning it to block_align */
172 pos = av_rescale_rnd(timestamp * byte_rate,
173 st->time_base.num,
174 st->time_base.den * (int64_t)block_align,
175 (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
176 pos *= block_align;
177
178 /* recompute exact position */
179 st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
180 if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
181 return ret;
182 return 0;
183 }
184
185 int ff_raw_audio_read_header(AVFormatContext *s, 131 int ff_raw_audio_read_header(AVFormatContext *s,
186 AVFormatParameters *ap) 132 AVFormatParameters *ap)
187 { 133 {
188 AVStream *st = av_new_stream(s, 0); 134 AVStream *st = av_new_stream(s, 0);
189 if (!st) 135 if (!st)
527 AVInputFormat rawvideo_demuxer = { 473 AVInputFormat rawvideo_demuxer = {
528 "rawvideo", 474 "rawvideo",
529 NULL_IF_CONFIG_SMALL("raw video format"), 475 NULL_IF_CONFIG_SMALL("raw video format"),
530 0, 476 0,
531 NULL, 477 NULL,
532 raw_read_header, 478 ff_raw_read_header,
533 rawvideo_read_packet, 479 rawvideo_read_packet,
534 .flags= AVFMT_GENERIC_INDEX, 480 .flags= AVFMT_GENERIC_INDEX,
535 .extensions = "yuv,cif,qcif,rgb", 481 .extensions = "yuv,cif,qcif,rgb",
536 .value = CODEC_ID_RAWVIDEO, 482 .value = CODEC_ID_RAWVIDEO,
537 }; 483 };
578 .value = CODEC_ID_VC1, 524 .value = CODEC_ID_VC1,
579 }; 525 };
580 #endif 526 #endif
581 527
582 /* PCM formats */ 528 /* PCM formats */
583
584 #define PCMINPUTDEF(name, long_name, ext, codec) \
585 AVInputFormat pcm_ ## name ## _demuxer = {\
586 #name,\
587 NULL_IF_CONFIG_SMALL(long_name),\
588 0,\
589 NULL,\
590 raw_read_header,\
591 raw_read_packet,\
592 NULL,\
593 pcm_read_seek,\
594 .flags= AVFMT_GENERIC_INDEX,\
595 .extensions = ext,\
596 .value = codec,\
597 };
598 529
599 #define PCMOUTPUTDEF(name, long_name, ext, codec) \ 530 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
600 AVOutputFormat pcm_ ## name ## _muxer = {\ 531 AVOutputFormat pcm_ ## name ## _muxer = {\
601 #name,\ 532 #name,\
602 NULL_IF_CONFIG_SMALL(long_name),\ 533 NULL_IF_CONFIG_SMALL(long_name),\
609 ff_raw_write_packet,\ 540 ff_raw_write_packet,\
610 .flags= AVFMT_NOTIMESTAMPS,\ 541 .flags= AVFMT_NOTIMESTAMPS,\
611 }; 542 };
612 543
613 544
614 #if !CONFIG_MUXERS && CONFIG_DEMUXERS 545 #if CONFIG_MUXERS
615 #define PCMDEF(name, long_name, ext, codec) \ 546 #define PCMDEF(name, long_name, ext, codec) \
616 PCMINPUTDEF(name, long_name, ext, codec)
617 #elif CONFIG_MUXERS && !CONFIG_DEMUXERS
618 #define PCMDEF(name, long_name, ext, codec) \
619 PCMOUTPUTDEF(name, long_name, ext, codec)
620 #elif CONFIG_MUXERS && CONFIG_DEMUXERS
621 #define PCMDEF(name, long_name, ext, codec) \
622 PCMINPUTDEF(name, long_name, ext, codec)\
623 PCMOUTPUTDEF(name, long_name, ext, codec) 547 PCMOUTPUTDEF(name, long_name, ext, codec)
624 #else 548 #else
625 #define PCMDEF(name, long_name, ext, codec) 549 #define PCMDEF(name, long_name, ext, codec)
626 #endif 550 #endif
627 551