OSDN Git Service

fix probe of 001.vdr-broken-6025
[coroid/ffmpeg_saccubus.git] / 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     if (p->buf_size < 6)
386         return 0;
387     d = p->buf;
388     code = (d[0] << 14) | (d[1] << 6) | (d[2] >> 2);
389     if (code == 0x20) {
390         return 50;
391     }
392     return 0;
393 }
394
395 static int h261_probe(AVProbeData *p)
396 {
397     int code;
398     const uint8_t *d;
399
400     if (p->buf_size < 6)
401         return 0;
402     d = p->buf;
403     code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4);
404     if (code == 0x10) {
405         return 50;
406     }
407     return 0;
408 }
409
410 static int ac3_probe(AVProbeData *p)
411 {
412     int max_frames, first_frames, frames;
413     uint8_t *buf, *buf2, *end;
414     AC3HeaderInfo hdr;
415
416     if(p->buf_size < 7)
417         return 0;
418
419     max_frames = 0;
420     buf = p->buf;
421     end = buf + FFMIN(4096, p->buf_size - 7);
422
423     for(; buf < end; buf++) {
424         buf2 = buf;
425
426         for(frames = 0; buf2 < end; frames++) {
427             if(ff_ac3_parse_header(buf2, &hdr) < 0)
428                 break;
429             buf2 += hdr.frame_size;
430         }
431         max_frames = FFMAX(max_frames, frames);
432         if(buf == p->buf)
433             first_frames = frames;
434     }
435     if   (first_frames>=3) return AVPROBE_SCORE_MAX * 3 / 4;
436     else if(max_frames>=3) return AVPROBE_SCORE_MAX / 2;
437     else if(max_frames>=1) return 1;
438     else                   return 0;
439 }
440
441 AVInputFormat shorten_demuxer = {
442     "shn",
443     "raw shorten",
444     0,
445     NULL,
446     shorten_read_header,
447     raw_read_partial_packet,
448     raw_read_close,
449     .flags= AVFMT_GENERIC_INDEX,
450     .extensions = "shn",
451 };
452
453 AVInputFormat flac_demuxer = {
454     "flac",
455     "raw flac",
456     0,
457     NULL,
458     flac_read_header,
459     raw_read_partial_packet,
460     raw_read_close,
461     .flags= AVFMT_GENERIC_INDEX,
462     .extensions = "flac",
463 };
464
465 #ifdef CONFIG_MUXERS
466 AVOutputFormat flac_muxer = {
467     "flac",
468     "raw flac",
469     "audio/x-flac",
470     "flac",
471     0,
472     CODEC_ID_FLAC,
473     0,
474     flac_write_header,
475     raw_write_packet,
476     raw_write_trailer,
477     .flags= AVFMT_NOTIMESTAMPS,
478 };
479 #endif //CONFIG_MUXERS
480
481 AVInputFormat ac3_demuxer = {
482     "ac3",
483     "raw ac3",
484     0,
485     ac3_probe,
486     ac3_read_header,
487     raw_read_partial_packet,
488     raw_read_close,
489     .flags= AVFMT_GENERIC_INDEX,
490     .extensions = "ac3",
491 };
492
493 #ifdef CONFIG_MUXERS
494 AVOutputFormat ac3_muxer = {
495     "ac3",
496     "raw ac3",
497     "audio/x-ac3",
498     "ac3",
499     0,
500     CODEC_ID_AC3,
501     0,
502     raw_write_header,
503     raw_write_packet,
504     raw_write_trailer,
505     .flags= AVFMT_NOTIMESTAMPS,
506 };
507 #endif //CONFIG_MUXERS
508
509 AVInputFormat dts_demuxer = {
510     "dts",
511     "raw dts",
512     0,
513     NULL,
514     dts_read_header,
515     raw_read_partial_packet,
516     raw_read_close,
517     .flags= AVFMT_GENERIC_INDEX,
518     .extensions = "dts",
519 };
520
521 AVInputFormat aac_demuxer = {
522     "aac",
523     "ADTS AAC",
524     0,
525     NULL,
526     aac_read_header,
527     raw_read_partial_packet,
528     raw_read_close,
529     .flags= AVFMT_GENERIC_INDEX,
530     .extensions = "aac",
531 };
532
533 AVInputFormat h261_demuxer = {
534     "h261",
535     "raw h261",
536     0,
537     h261_probe,
538     video_read_header,
539     raw_read_partial_packet,
540     raw_read_close,
541     .flags= AVFMT_GENERIC_INDEX,
542     .extensions = "h261",
543     .value = CODEC_ID_H261,
544 };
545
546 #ifdef CONFIG_MUXERS
547 AVOutputFormat h261_muxer = {
548     "h261",
549     "raw h261",
550     "video/x-h261",
551     "h261",
552     0,
553     0,
554     CODEC_ID_H261,
555     raw_write_header,
556     raw_write_packet,
557     raw_write_trailer,
558     .flags= AVFMT_NOTIMESTAMPS,
559 };
560 #endif //CONFIG_MUXERS
561
562 AVInputFormat h263_demuxer = {
563     "h263",
564     "raw h263",
565     0,
566     h263_probe,
567     video_read_header,
568     raw_read_partial_packet,
569     raw_read_close,
570     .flags= AVFMT_GENERIC_INDEX,
571 //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
572     .value = CODEC_ID_H263,
573 };
574
575 #ifdef CONFIG_MUXERS
576 AVOutputFormat h263_muxer = {
577     "h263",
578     "raw h263",
579     "video/x-h263",
580     "h263",
581     0,
582     0,
583     CODEC_ID_H263,
584     raw_write_header,
585     raw_write_packet,
586     raw_write_trailer,
587     .flags= AVFMT_NOTIMESTAMPS,
588 };
589 #endif //CONFIG_MUXERS
590
591 AVInputFormat m4v_demuxer = {
592     "m4v",
593     "raw MPEG4 video format",
594     0,
595     mpeg4video_probe, /** probing for mpeg4 data */
596     video_read_header,
597     raw_read_partial_packet,
598     raw_read_close,
599     .flags= AVFMT_GENERIC_INDEX,
600     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
601     .value = CODEC_ID_MPEG4,
602 };
603
604 #ifdef CONFIG_MUXERS
605 AVOutputFormat m4v_muxer = {
606     "m4v",
607     "raw MPEG4 video format",
608     NULL,
609     "m4v",
610     0,
611     CODEC_ID_NONE,
612     CODEC_ID_MPEG4,
613     raw_write_header,
614     raw_write_packet,
615     raw_write_trailer,
616     .flags= AVFMT_NOTIMESTAMPS,
617 };
618 #endif //CONFIG_MUXERS
619
620 AVInputFormat h264_demuxer = {
621     "h264",
622     "raw H264 video format",
623     0,
624     NULL /*mpegvideo_probe*/,
625     video_read_header,
626     raw_read_partial_packet,
627     raw_read_close,
628     .flags= AVFMT_GENERIC_INDEX,
629     .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
630     .value = CODEC_ID_H264,
631 };
632
633 #ifdef CONFIG_MUXERS
634 AVOutputFormat h264_muxer = {
635     "h264",
636     "raw H264 video format",
637     NULL,
638     "h264",
639     0,
640     CODEC_ID_NONE,
641     CODEC_ID_H264,
642     raw_write_header,
643     raw_write_packet,
644     raw_write_trailer,
645     .flags= AVFMT_NOTIMESTAMPS,
646 };
647 #endif //CONFIG_MUXERS
648
649 AVInputFormat mpegvideo_demuxer = {
650     "mpegvideo",
651     "MPEG video",
652     0,
653     mpegvideo_probe,
654     video_read_header,
655     raw_read_partial_packet,
656     raw_read_close,
657     .flags= AVFMT_GENERIC_INDEX,
658     .value = CODEC_ID_MPEG1VIDEO,
659 };
660
661 #ifdef CONFIG_MUXERS
662 AVOutputFormat mpeg1video_muxer = {
663     "mpeg1video",
664     "MPEG video",
665     "video/x-mpeg",
666     "mpg,mpeg,m1v",
667     0,
668     0,
669     CODEC_ID_MPEG1VIDEO,
670     raw_write_header,
671     raw_write_packet,
672     raw_write_trailer,
673     .flags= AVFMT_NOTIMESTAMPS,
674 };
675 #endif //CONFIG_MUXERS
676
677 #ifdef CONFIG_MUXERS
678 AVOutputFormat mpeg2video_muxer = {
679     "mpeg2video",
680     "MPEG2 video",
681     NULL,
682     "m2v",
683     0,
684     0,
685     CODEC_ID_MPEG2VIDEO,
686     raw_write_header,
687     raw_write_packet,
688     raw_write_trailer,
689     .flags= AVFMT_NOTIMESTAMPS,
690 };
691 #endif //CONFIG_MUXERS
692
693 AVInputFormat mjpeg_demuxer = {
694     "mjpeg",
695     "MJPEG video",
696     0,
697     NULL,
698     video_read_header,
699     raw_read_partial_packet,
700     raw_read_close,
701     .flags= AVFMT_GENERIC_INDEX,
702     .extensions = "mjpg,mjpeg",
703     .value = CODEC_ID_MJPEG,
704 };
705
706 AVInputFormat ingenient_demuxer = {
707     "ingenient",
708     "Ingenient MJPEG",
709     0,
710     NULL,
711     video_read_header,
712     ingenient_read_packet,
713     raw_read_close,
714     .flags= AVFMT_GENERIC_INDEX,
715     .extensions = "cgi", // FIXME
716     .value = CODEC_ID_MJPEG,
717 };
718
719 #ifdef CONFIG_MUXERS
720 AVOutputFormat mjpeg_muxer = {
721     "mjpeg",
722     "MJPEG video",
723     "video/x-mjpeg",
724     "mjpg,mjpeg",
725     0,
726     0,
727     CODEC_ID_MJPEG,
728     raw_write_header,
729     raw_write_packet,
730     raw_write_trailer,
731     .flags= AVFMT_NOTIMESTAMPS,
732 };
733 #endif //CONFIG_MUXERS
734
735 AVInputFormat vc1_demuxer = {
736     "vc1",
737     "raw vc1",
738     0,
739     NULL /* vc1_probe */,
740     video_read_header,
741     raw_read_partial_packet,
742     raw_read_close,
743     .extensions = "vc1",
744     .value = CODEC_ID_VC1,
745 };
746
747 /* pcm formats */
748
749 #define PCMINPUTDEF(name, long_name, ext, codec) \
750 AVInputFormat pcm_ ## name ## _demuxer = {\
751     #name,\
752     long_name,\
753     0,\
754     NULL,\
755     raw_read_header,\
756     raw_read_packet,\
757     raw_read_close,\
758     pcm_read_seek,\
759     .flags= AVFMT_GENERIC_INDEX,\
760     .extensions = ext,\
761     .value = codec,\
762 };
763
764 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
765 AVOutputFormat pcm_ ## name ## _muxer = {\
766     #name,\
767     long_name,\
768     NULL,\
769     ext,\
770     0,\
771     codec,\
772     0,\
773     raw_write_header,\
774     raw_write_packet,\
775     raw_write_trailer,\
776     .flags= AVFMT_NOTIMESTAMPS,\
777 };
778
779
780 #if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
781 #define PCMDEF(name, long_name, ext, codec) \
782         PCMINPUTDEF(name, long_name, ext, codec)
783 #elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
784 #define PCMDEF(name, long_name, ext, codec) \
785         PCMOUTPUTDEF(name, long_name, ext, codec)
786 #elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
787 #define PCMDEF(name, long_name, ext, codec) \
788         PCMINPUTDEF(name, long_name, ext, codec)\
789         PCMOUTPUTDEF(name, long_name, ext, codec)
790 #else
791 #define PCMDEF(name, long_name, ext, codec)
792 #endif
793
794 #ifdef WORDS_BIGENDIAN
795 #define BE_DEF(s) s
796 #define LE_DEF(s) NULL
797 #else
798 #define BE_DEF(s) NULL
799 #define LE_DEF(s) s
800 #endif
801
802
803 PCMDEF(s16le, "pcm signed 16 bit little endian format",
804        LE_DEF("sw"), CODEC_ID_PCM_S16LE)
805
806 PCMDEF(s16be, "pcm signed 16 bit big endian format",
807        BE_DEF("sw"), CODEC_ID_PCM_S16BE)
808
809 PCMDEF(u16le, "pcm unsigned 16 bit little endian format",
810        LE_DEF("uw"), CODEC_ID_PCM_U16LE)
811
812 PCMDEF(u16be, "pcm unsigned 16 bit big endian format",
813        BE_DEF("uw"), CODEC_ID_PCM_U16BE)
814
815 PCMDEF(s8, "pcm signed 8 bit format",
816        "sb", CODEC_ID_PCM_S8)
817
818 PCMDEF(u8, "pcm unsigned 8 bit format",
819        "ub", CODEC_ID_PCM_U8)
820
821 PCMDEF(mulaw, "pcm mu law format",
822        "ul", CODEC_ID_PCM_MULAW)
823
824 PCMDEF(alaw, "pcm A law format",
825        "al", CODEC_ID_PCM_ALAW)
826
827 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
828 {
829     int packet_size, ret, width, height;
830     AVStream *st = s->streams[0];
831
832     width = st->codec->width;
833     height = st->codec->height;
834
835     packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
836     if (packet_size < 0)
837         return -1;
838
839     ret= av_get_packet(&s->pb, pkt, packet_size);
840
841     pkt->stream_index = 0;
842     if (ret != packet_size) {
843         return AVERROR_IO;
844     } else {
845         return 0;
846     }
847 }
848
849 AVInputFormat rawvideo_demuxer = {
850     "rawvideo",
851     "raw video format",
852     0,
853     NULL,
854     raw_read_header,
855     rawvideo_read_packet,
856     raw_read_close,
857     .flags= AVFMT_GENERIC_INDEX,
858     .extensions = "yuv,cif,qcif",
859     .value = CODEC_ID_RAWVIDEO,
860 };
861
862 #ifdef CONFIG_MUXERS
863 AVOutputFormat rawvideo_muxer = {
864     "rawvideo",
865     "raw video format",
866     NULL,
867     "yuv",
868     0,
869     CODEC_ID_NONE,
870     CODEC_ID_RAWVIDEO,
871     raw_write_header,
872     raw_write_packet,
873     raw_write_trailer,
874     .flags= AVFMT_NOTIMESTAMPS,
875 };
876 #endif //CONFIG_MUXERS
877
878 #ifdef CONFIG_MUXERS
879 static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
880 {
881     return 0;
882 }
883
884 AVOutputFormat null_muxer = {
885     "null",
886     "null video format",
887     NULL,
888     NULL,
889     0,
890 #ifdef WORDS_BIGENDIAN
891     CODEC_ID_PCM_S16BE,
892 #else
893     CODEC_ID_PCM_S16LE,
894 #endif
895     CODEC_ID_RAWVIDEO,
896     raw_write_header,
897     null_write_packet,
898     raw_write_trailer,
899     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE | AVFMT_NOTIMESTAMPS,
900 };
901 #endif //CONFIG_MUXERS