OSDN Git Service

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