]> git.sesse.net Git - ffmpeg/blob - libavformat/raw.c
factorize
[ffmpeg] / libavformat / raw.c
1 /*
2  * RAW muxer and demuxer
3  * Copyright (c) 2001 Fabrice Bellard.
4  * Copyright (c) 2005 Alex Beregszaszi
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #include "avformat.h"
23 #include "ac3.h"
24
25 #ifdef CONFIG_MUXERS
26 /* simple formats */
27 static int raw_write_header(struct AVFormatContext *s)
28 {
29     return 0;
30 }
31
32 static int flac_write_header(struct AVFormatContext *s)
33 {
34     static const uint8_t header[8] = {
35         0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22
36     };
37     uint8_t *streaminfo = s->streams[0]->codec->extradata;
38     int len = s->streams[0]->codec->extradata_size;
39     if(streaminfo != NULL && len > 0) {
40         put_buffer(&s->pb, header, 8);
41         put_buffer(&s->pb, streaminfo, len);
42     }
43     return 0;
44 }
45
46 static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt)
47 {
48     put_buffer(&s->pb, pkt->data, pkt->size);
49     put_flush_packet(&s->pb);
50     return 0;
51 }
52
53 static int raw_write_trailer(struct AVFormatContext *s)
54 {
55     return 0;
56 }
57 #endif //CONFIG_MUXERS
58
59 /* raw input */
60 static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
61 {
62     AVStream *st;
63     int id;
64
65     st = av_new_stream(s, 0);
66     if (!st)
67         return AVERROR_NOMEM;
68
69         id = s->iformat->value;
70         if (id == CODEC_ID_RAWVIDEO) {
71             st->codec->codec_type = CODEC_TYPE_VIDEO;
72         } else {
73             st->codec->codec_type = CODEC_TYPE_AUDIO;
74         }
75         st->codec->codec_id = id;
76
77         switch(st->codec->codec_type) {
78         case CODEC_TYPE_AUDIO:
79             st->codec->sample_rate = ap->sample_rate;
80             st->codec->channels = ap->channels;
81             av_set_pts_info(st, 64, 1, st->codec->sample_rate);
82             break;
83         case CODEC_TYPE_VIDEO:
84             av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
85             st->codec->width = ap->width;
86             st->codec->height = ap->height;
87             st->codec->pix_fmt = ap->pix_fmt;
88             if(st->codec->pix_fmt == PIX_FMT_NONE)
89                 st->codec->pix_fmt= PIX_FMT_YUV420P;
90             break;
91         default:
92             return -1;
93         }
94     return 0;
95 }
96
97 #define RAW_PACKET_SIZE 1024
98
99 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
100 {
101     int ret, size;
102     //    AVStream *st = s->streams[0];
103
104     size= RAW_PACKET_SIZE;
105
106     ret= av_get_packet(&s->pb, pkt, size);
107
108     pkt->stream_index = 0;
109     if (ret <= 0) {
110         return AVERROR_IO;
111     }
112     /* note: we need to modify the packet size here to handle the last
113        packet */
114     pkt->size = ret;
115     return ret;
116 }
117
118 static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
119 {
120     int ret, size;
121
122     size = RAW_PACKET_SIZE;
123
124     if (av_new_packet(pkt, size) < 0)
125         return AVERROR_IO;
126
127     pkt->pos= url_ftell(&s->pb);
128     pkt->stream_index = 0;
129     ret = get_partial_buffer(&s->pb, pkt->data, size);
130     if (ret <= 0) {
131         av_free_packet(pkt);
132         return AVERROR_IO;
133     }
134     pkt->size = ret;
135     return ret;
136 }
137
138 // http://www.artificis.hu/files/texts/ingenient.txt
139 static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
140 {
141     int ret, size, w, h, unk1, unk2;
142
143     if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G'))
144         return AVERROR_IO; // FIXME
145
146     size = get_le32(&s->pb);
147
148     w = get_le16(&s->pb);
149     h = get_le16(&s->pb);
150
151     url_fskip(&s->pb, 8); // zero + size (padded?)
152     url_fskip(&s->pb, 2);
153     unk1 = get_le16(&s->pb);
154     unk2 = get_le16(&s->pb);
155     url_fskip(&s->pb, 22); // ascii timestamp
156
157     av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
158         size, w, h, unk1, unk2);
159
160     if (av_new_packet(pkt, size) < 0)
161         return AVERROR_IO;
162
163     pkt->pos = url_ftell(&s->pb);
164     pkt->stream_index = 0;
165     ret = get_buffer(&s->pb, pkt->data, size);
166     if (ret <= 0) {
167         av_free_packet(pkt);
168         return AVERROR_IO;
169     }
170     pkt->size = ret;
171     return ret;
172 }
173
174 static int raw_read_close(AVFormatContext *s)
175 {
176     return 0;
177 }
178
179 int pcm_read_seek(AVFormatContext *s,
180                   int stream_index, int64_t timestamp, int flags)
181 {
182     AVStream *st;
183     int block_align, byte_rate;
184     int64_t pos;
185
186     st = s->streams[0];
187
188     block_align = st->codec->block_align ? st->codec->block_align :
189         (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
190     byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
191         block_align * st->codec->sample_rate;
192
193     if (block_align <= 0 || byte_rate <= 0)
194         return -1;
195
196     /* compute the position by aligning it to block_align */
197     pos = av_rescale_rnd(timestamp * byte_rate,
198                          st->time_base.num,
199                          st->time_base.den * (int64_t)block_align,
200                          (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
201     pos *= block_align;
202
203     /* recompute exact position */
204     st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
205     url_fseek(&s->pb, pos + s->data_offset, SEEK_SET);
206     return 0;
207 }
208
209 /* ac3 read */
210 static int ac3_read_header(AVFormatContext *s,
211                            AVFormatParameters *ap)
212 {
213     AVStream *st;
214
215     st = av_new_stream(s, 0);
216     if (!st)
217         return AVERROR_NOMEM;
218
219     st->codec->codec_type = CODEC_TYPE_AUDIO;
220     st->codec->codec_id = CODEC_ID_AC3;
221     st->need_parsing = 1;
222     /* the parameters will be extracted from the compressed bitstream */
223     return 0;
224 }
225
226 static int shorten_read_header(AVFormatContext *s,
227                                AVFormatParameters *ap)
228 {
229     AVStream *st;
230
231     st = av_new_stream(s, 0);
232     if (!st)
233         return AVERROR_NOMEM;
234     st->codec->codec_type = CODEC_TYPE_AUDIO;
235     st->codec->codec_id = CODEC_ID_SHORTEN;
236     st->need_parsing = 1;
237     /* the parameters will be extracted from the compressed bitstream */
238     return 0;
239 }
240
241 /* flac read */
242 static int flac_read_header(AVFormatContext *s,
243                             AVFormatParameters *ap)
244 {
245     AVStream *st;
246
247     st = av_new_stream(s, 0);
248     if (!st)
249         return AVERROR_NOMEM;
250     st->codec->codec_type = CODEC_TYPE_AUDIO;
251     st->codec->codec_id = CODEC_ID_FLAC;
252     st->need_parsing = 1;
253     /* the parameters will be extracted from the compressed bitstream */
254     return 0;
255 }
256
257 /* dts read */
258 static int dts_read_header(AVFormatContext *s,
259                            AVFormatParameters *ap)
260 {
261     AVStream *st;
262
263     st = av_new_stream(s, 0);
264     if (!st)
265         return AVERROR_NOMEM;
266
267     st->codec->codec_type = CODEC_TYPE_AUDIO;
268     st->codec->codec_id = CODEC_ID_DTS;
269     st->need_parsing = 1;
270     /* the parameters will be extracted from the compressed bitstream */
271     return 0;
272 }
273
274 /* aac read */
275 static int aac_read_header(AVFormatContext *s,
276                            AVFormatParameters *ap)
277 {
278     AVStream *st;
279
280     st = av_new_stream(s, 0);
281     if (!st)
282         return AVERROR_NOMEM;
283
284     st->codec->codec_type = CODEC_TYPE_AUDIO;
285     st->codec->codec_id = CODEC_ID_AAC;
286     st->need_parsing = 1;
287     /* the parameters will be extracted from the compressed bitstream */
288     return 0;
289 }
290
291 /* mpeg1/h263 input */
292 static int video_read_header(AVFormatContext *s,
293                              AVFormatParameters *ap)
294 {
295     AVStream *st;
296
297     st = av_new_stream(s, 0);
298     if (!st)
299         return AVERROR_NOMEM;
300
301     st->codec->codec_type = CODEC_TYPE_VIDEO;
302     st->codec->codec_id = s->iformat->value;
303     st->need_parsing = 1;
304
305     /* for mjpeg, specify frame rate */
306     /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/
307     if (ap->time_base.num) {
308         av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
309     } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
310                 st->codec->codec_id == CODEC_ID_MPEG4 ||
311                 st->codec->codec_id == CODEC_ID_H264) {
312         av_set_pts_info(st, 64, 1, 25);
313     }
314
315     return 0;
316 }
317
318 #define SEQ_START_CODE          0x000001b3
319 #define GOP_START_CODE          0x000001b8
320 #define PICTURE_START_CODE      0x00000100
321 #define SLICE_START_CODE        0x00000101
322 #define PACK_START_CODE         0x000001ba
323 #define VIDEO_ID                0x000001e0
324 #define AUDIO_ID                0x000001c0
325
326 static int mpegvideo_probe(AVProbeData *p)
327 {
328     uint32_t code= -1;
329     int pic=0, seq=0, slice=0, pspack=0, pes=0;
330     int i;
331
332     for(i=0; i<p->buf_size; i++){
333         code = (code<<8) + p->buf[i];
334         if ((code & 0xffffff00) == 0x100) {
335             switch(code){
336             case     SEQ_START_CODE:   seq++; break;
337             case PICTURE_START_CODE:   pic++; break;
338             case   SLICE_START_CODE: slice++; break;
339             case    PACK_START_CODE: pspack++; break;
340             }
341             if     ((code & 0x1f0) == VIDEO_ID)   pes++;
342             else if((code & 0x1e0) == AUDIO_ID)   pes++;
343         }
344     }
345     if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
346         return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
347     return 0;
348 }
349
350 #define VIDEO_OBJECT_START_CODE        0x00000100
351 #define VIDEO_OBJECT_LAYER_START_CODE  0x00000120
352 #define VISUAL_OBJECT_START_CODE       0x000001b5
353 #define VOP_START_CODE                 0x000001b6
354
355 static int mpeg4video_probe(AVProbeData *probe_packet)
356 {
357     uint32_t temp_buffer= -1;
358     int VO=0, VOL=0, VOP = 0, VISO = 0;
359     int i;
360
361     for(i=0; i<probe_packet->buf_size; i++){
362         temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
363         if ((temp_buffer & 0xffffff00) == 0x100) {
364             switch(temp_buffer){
365             case VOP_START_CODE:             VOP++; break;
366             case VISUAL_OBJECT_START_CODE:  VISO++; break;
367             }
368             switch(temp_buffer & 0xfffffff0){
369             case VIDEO_OBJECT_START_CODE:            VO++; break;
370             case VIDEO_OBJECT_LAYER_START_CODE:     VOL++; break;
371             }
372         }
373     }
374
375     if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0)
376         return AVPROBE_SCORE_MAX/2;
377     return 0;
378 }
379
380 static int h263_probe(AVProbeData *p)
381 {
382     int code;
383     const uint8_t *d;
384
385     d = p->buf;
386     code = (d[0] << 14) | (d[1] << 6) | (d[2] >> 2);
387     if (code == 0x20) {
388         return 50;
389     }
390     return 0;
391 }
392
393 static int h261_probe(AVProbeData *p)
394 {
395     int code;
396     const uint8_t *d;
397
398     d = p->buf;
399     code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4);
400     if (code == 0x10) {
401         return 50;
402     }
403     return 0;
404 }
405
406 static int ac3_probe(AVProbeData *p)
407 {
408     int max_frames, first_frames, frames;
409     uint8_t *buf, *buf2, *end;
410     AC3HeaderInfo hdr;
411
412     if(p->buf_size < 7)
413         return 0;
414
415     max_frames = 0;
416     buf = p->buf;
417     end = buf + FFMIN(4096, p->buf_size - 7);
418
419     for(; buf < end; buf++) {
420         buf2 = buf;
421
422         for(frames = 0; buf2 < end; frames++) {
423             if(ff_ac3_parse_header(buf2, &hdr) < 0)
424                 break;
425             buf2 += hdr.frame_size;
426         }
427         max_frames = FFMAX(max_frames, frames);
428         if(buf == p->buf)
429             first_frames = frames;
430     }
431     if   (first_frames>=3) return AVPROBE_SCORE_MAX * 3 / 4;
432     else if(max_frames>=3) return AVPROBE_SCORE_MAX / 2;
433     else if(max_frames>=1) return 1;
434     else                   return 0;
435 }
436
437 AVInputFormat shorten_demuxer = {
438     "shn",
439     "raw shorten",
440     0,
441     NULL,
442     shorten_read_header,
443     raw_read_partial_packet,
444     raw_read_close,
445     .flags= AVFMT_GENERIC_INDEX,
446     .extensions = "shn",
447 };
448
449 AVInputFormat flac_demuxer = {
450     "flac",
451     "raw flac",
452     0,
453     NULL,
454     flac_read_header,
455     raw_read_partial_packet,
456     raw_read_close,
457     .flags= AVFMT_GENERIC_INDEX,
458     .extensions = "flac",
459 };
460
461 #ifdef CONFIG_MUXERS
462 AVOutputFormat flac_muxer = {
463     "flac",
464     "raw flac",
465     "audio/x-flac",
466     "flac",
467     0,
468     CODEC_ID_FLAC,
469     0,
470     flac_write_header,
471     raw_write_packet,
472     raw_write_trailer,
473     .flags= AVFMT_NOTIMESTAMPS,
474 };
475 #endif //CONFIG_MUXERS
476
477 AVInputFormat ac3_demuxer = {
478     "ac3",
479     "raw ac3",
480     0,
481     ac3_probe,
482     ac3_read_header,
483     raw_read_partial_packet,
484     raw_read_close,
485     .flags= AVFMT_GENERIC_INDEX,
486     .extensions = "ac3",
487 };
488
489 #ifdef CONFIG_MUXERS
490 AVOutputFormat ac3_muxer = {
491     "ac3",
492     "raw ac3",
493     "audio/x-ac3",
494     "ac3",
495     0,
496     CODEC_ID_AC3,
497     0,
498     raw_write_header,
499     raw_write_packet,
500     raw_write_trailer,
501     .flags= AVFMT_NOTIMESTAMPS,
502 };
503 #endif //CONFIG_MUXERS
504
505 AVInputFormat dts_demuxer = {
506     "dts",
507     "raw dts",
508     0,
509     NULL,
510     dts_read_header,
511     raw_read_partial_packet,
512     raw_read_close,
513     .flags= AVFMT_GENERIC_INDEX,
514     .extensions = "dts",
515 };
516
517 AVInputFormat aac_demuxer = {
518     "aac",
519     "ADTS AAC",
520     0,
521     NULL,
522     aac_read_header,
523     raw_read_partial_packet,
524     raw_read_close,
525     .flags= AVFMT_GENERIC_INDEX,
526     .extensions = "aac",
527 };
528
529 AVInputFormat h261_demuxer = {
530     "h261",
531     "raw h261",
532     0,
533     h261_probe,
534     video_read_header,
535     raw_read_partial_packet,
536     raw_read_close,
537     .flags= AVFMT_GENERIC_INDEX,
538     .extensions = "h261",
539     .value = CODEC_ID_H261,
540 };
541
542 #ifdef CONFIG_MUXERS
543 AVOutputFormat h261_muxer = {
544     "h261",
545     "raw h261",
546     "video/x-h261",
547     "h261",
548     0,
549     0,
550     CODEC_ID_H261,
551     raw_write_header,
552     raw_write_packet,
553     raw_write_trailer,
554     .flags= AVFMT_NOTIMESTAMPS,
555 };
556 #endif //CONFIG_MUXERS
557
558 AVInputFormat h263_demuxer = {
559     "h263",
560     "raw h263",
561     0,
562     h263_probe,
563     video_read_header,
564     raw_read_partial_packet,
565     raw_read_close,
566     .flags= AVFMT_GENERIC_INDEX,
567 //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
568     .value = CODEC_ID_H263,
569 };
570
571 #ifdef CONFIG_MUXERS
572 AVOutputFormat h263_muxer = {
573     "h263",
574     "raw h263",
575     "video/x-h263",
576     "h263",
577     0,
578     0,
579     CODEC_ID_H263,
580     raw_write_header,
581     raw_write_packet,
582     raw_write_trailer,
583     .flags= AVFMT_NOTIMESTAMPS,
584 };
585 #endif //CONFIG_MUXERS
586
587 AVInputFormat m4v_demuxer = {
588     "m4v",
589     "raw MPEG4 video format",
590     0,
591     mpeg4video_probe, /** probing for mpeg4 data */
592     video_read_header,
593     raw_read_partial_packet,
594     raw_read_close,
595     .flags= AVFMT_GENERIC_INDEX,
596     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
597     .value = CODEC_ID_MPEG4,
598 };
599
600 #ifdef CONFIG_MUXERS
601 AVOutputFormat m4v_muxer = {
602     "m4v",
603     "raw MPEG4 video format",
604     NULL,
605     "m4v",
606     0,
607     CODEC_ID_NONE,
608     CODEC_ID_MPEG4,
609     raw_write_header,
610     raw_write_packet,
611     raw_write_trailer,
612     .flags= AVFMT_NOTIMESTAMPS,
613 };
614 #endif //CONFIG_MUXERS
615
616 AVInputFormat h264_demuxer = {
617     "h264",
618     "raw H264 video format",
619     0,
620     NULL /*mpegvideo_probe*/,
621     video_read_header,
622     raw_read_partial_packet,
623     raw_read_close,
624     .flags= AVFMT_GENERIC_INDEX,
625     .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
626     .value = CODEC_ID_H264,
627 };
628
629 #ifdef CONFIG_MUXERS
630 AVOutputFormat h264_muxer = {
631     "h264",
632     "raw H264 video format",
633     NULL,
634     "h264",
635     0,
636     CODEC_ID_NONE,
637     CODEC_ID_H264,
638     raw_write_header,
639     raw_write_packet,
640     raw_write_trailer,
641     .flags= AVFMT_NOTIMESTAMPS,
642 };
643 #endif //CONFIG_MUXERS
644
645 AVInputFormat mpegvideo_demuxer = {
646     "mpegvideo",
647     "MPEG video",
648     0,
649     mpegvideo_probe,
650     video_read_header,
651     raw_read_partial_packet,
652     raw_read_close,
653     .flags= AVFMT_GENERIC_INDEX,
654     .value = CODEC_ID_MPEG1VIDEO,
655 };
656
657 #ifdef CONFIG_MUXERS
658 AVOutputFormat mpeg1video_muxer = {
659     "mpeg1video",
660     "MPEG video",
661     "video/x-mpeg",
662     "mpg,mpeg,m1v",
663     0,
664     0,
665     CODEC_ID_MPEG1VIDEO,
666     raw_write_header,
667     raw_write_packet,
668     raw_write_trailer,
669     .flags= AVFMT_NOTIMESTAMPS,
670 };
671 #endif //CONFIG_MUXERS
672
673 #ifdef CONFIG_MUXERS
674 AVOutputFormat mpeg2video_muxer = {
675     "mpeg2video",
676     "MPEG2 video",
677     NULL,
678     "m2v",
679     0,
680     0,
681     CODEC_ID_MPEG2VIDEO,
682     raw_write_header,
683     raw_write_packet,
684     raw_write_trailer,
685     .flags= AVFMT_NOTIMESTAMPS,
686 };
687 #endif //CONFIG_MUXERS
688
689 AVInputFormat mjpeg_demuxer = {
690     "mjpeg",
691     "MJPEG video",
692     0,
693     NULL,
694     video_read_header,
695     raw_read_partial_packet,
696     raw_read_close,
697     .flags= AVFMT_GENERIC_INDEX,
698     .extensions = "mjpg,mjpeg",
699     .value = CODEC_ID_MJPEG,
700 };
701
702 AVInputFormat ingenient_demuxer = {
703     "ingenient",
704     "Ingenient MJPEG",
705     0,
706     NULL,
707     video_read_header,
708     ingenient_read_packet,
709     raw_read_close,
710     .flags= AVFMT_GENERIC_INDEX,
711     .extensions = "cgi", // FIXME
712     .value = CODEC_ID_MJPEG,
713 };
714
715 #ifdef CONFIG_MUXERS
716 AVOutputFormat mjpeg_muxer = {
717     "mjpeg",
718     "MJPEG video",
719     "video/x-mjpeg",
720     "mjpg,mjpeg",
721     0,
722     0,
723     CODEC_ID_MJPEG,
724     raw_write_header,
725     raw_write_packet,
726     raw_write_trailer,
727     .flags= AVFMT_NOTIMESTAMPS,
728 };
729 #endif //CONFIG_MUXERS
730
731 AVInputFormat vc1_demuxer = {
732     "vc1",
733     "raw vc1",
734     0,
735     NULL /* vc1_probe */,
736     video_read_header,
737     raw_read_partial_packet,
738     raw_read_close,
739     .extensions = "vc1",
740     .value = CODEC_ID_VC1,
741 };
742
743 /* pcm formats */
744
745 #define PCMINPUTDEF(name, long_name, ext, codec) \
746 AVInputFormat pcm_ ## name ## _demuxer = {\
747     #name,\
748     long_name,\
749     0,\
750     NULL,\
751     raw_read_header,\
752     raw_read_packet,\
753     raw_read_close,\
754     pcm_read_seek,\
755     .flags= AVFMT_GENERIC_INDEX,\
756     .extensions = ext,\
757     .value = codec,\
758 };
759
760 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
761 AVOutputFormat pcm_ ## name ## _muxer = {\
762     #name,\
763     long_name,\
764     NULL,\
765     ext,\
766     0,\
767     codec,\
768     0,\
769     raw_write_header,\
770     raw_write_packet,\
771     raw_write_trailer,\
772     .flags= AVFMT_NOTIMESTAMPS,\
773 };
774
775
776 #if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
777 #define PCMDEF(name, long_name, ext, codec) \
778         PCMINPUTDEF(name, long_name, ext, codec)
779 #elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
780 #define PCMDEF(name, long_name, ext, codec) \
781         PCMOUTPUTDEF(name, long_name, ext, codec)
782 #elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
783 #define PCMDEF(name, long_name, ext, codec) \
784         PCMINPUTDEF(name, long_name, ext, codec)\
785         PCMOUTPUTDEF(name, long_name, ext, codec)
786 #else
787 #define PCMDEF(name, long_name, ext, codec)
788 #endif
789
790 #ifdef WORDS_BIGENDIAN
791 #define BE_DEF(s) s
792 #define LE_DEF(s) NULL
793 #else
794 #define BE_DEF(s) NULL
795 #define LE_DEF(s) s
796 #endif
797
798
799 PCMDEF(s16le, "pcm signed 16 bit little endian format",
800        LE_DEF("sw"), CODEC_ID_PCM_S16LE)
801
802 PCMDEF(s16be, "pcm signed 16 bit big endian format",
803        BE_DEF("sw"), CODEC_ID_PCM_S16BE)
804
805 PCMDEF(u16le, "pcm unsigned 16 bit little endian format",
806        LE_DEF("uw"), CODEC_ID_PCM_U16LE)
807
808 PCMDEF(u16be, "pcm unsigned 16 bit big endian format",
809        BE_DEF("uw"), CODEC_ID_PCM_U16BE)
810
811 PCMDEF(s8, "pcm signed 8 bit format",
812        "sb", CODEC_ID_PCM_S8)
813
814 PCMDEF(u8, "pcm unsigned 8 bit format",
815        "ub", CODEC_ID_PCM_U8)
816
817 PCMDEF(mulaw, "pcm mu law format",
818        "ul", CODEC_ID_PCM_MULAW)
819
820 PCMDEF(alaw, "pcm A law format",
821        "al", CODEC_ID_PCM_ALAW)
822
823 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
824 {
825     int packet_size, ret, width, height;
826     AVStream *st = s->streams[0];
827
828     width = st->codec->width;
829     height = st->codec->height;
830
831     packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
832     if (packet_size < 0)
833         return -1;
834
835     ret= av_get_packet(&s->pb, pkt, packet_size);
836
837     pkt->stream_index = 0;
838     if (ret != packet_size) {
839         return AVERROR_IO;
840     } else {
841         return 0;
842     }
843 }
844
845 AVInputFormat rawvideo_demuxer = {
846     "rawvideo",
847     "raw video format",
848     0,
849     NULL,
850     raw_read_header,
851     rawvideo_read_packet,
852     raw_read_close,
853     .flags= AVFMT_GENERIC_INDEX,
854     .extensions = "yuv,cif,qcif",
855     .value = CODEC_ID_RAWVIDEO,
856 };
857
858 #ifdef CONFIG_MUXERS
859 AVOutputFormat rawvideo_muxer = {
860     "rawvideo",
861     "raw video format",
862     NULL,
863     "yuv",
864     0,
865     CODEC_ID_NONE,
866     CODEC_ID_RAWVIDEO,
867     raw_write_header,
868     raw_write_packet,
869     raw_write_trailer,
870     .flags= AVFMT_NOTIMESTAMPS,
871 };
872 #endif //CONFIG_MUXERS
873
874 #ifdef CONFIG_MUXERS
875 static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
876 {
877     return 0;
878 }
879
880 AVOutputFormat null_muxer = {
881     "null",
882     "null video format",
883     NULL,
884     NULL,
885     0,
886 #ifdef WORDS_BIGENDIAN
887     CODEC_ID_PCM_S16BE,
888 #else
889     CODEC_ID_PCM_S16LE,
890 #endif
891     CODEC_ID_RAWVIDEO,
892     raw_write_header,
893     null_write_packet,
894     raw_write_trailer,
895     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE | AVFMT_NOTIMESTAMPS,
896 };
897 #endif //CONFIG_MUXERS