Mercurial > libavformat.hg
annotate filmstripenc.c @ 6119:16ca32d9c5f0 libavformat
Use a bitstream filter for converting the extradata syntax when generating an SDP.
This allows to generate correct SDPs for H.264 video in "MP4 syntax".
author | lucabe |
---|---|
date | Fri, 11 Jun 2010 08:01:45 +0000 |
parents | 178de7695c6c |
children |
rev | line source |
---|---|
5547 | 1 /* |
2 * Adobe Filmstrip muxer | |
3 * Copyright (c) 2010 Peter Ross | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
5969
178de7695c6c
Remove explicit filename from Doxygen @file commands.
diego
parents:
5547
diff
changeset
|
23 * @file |
5547 | 24 * Adobe Filmstrip muxer |
25 */ | |
26 | |
27 #include "libavutil/intreadwrite.h" | |
28 #include "avformat.h" | |
29 | |
30 #define RAND_TAG MKBETAG('R','a','n','d') | |
31 | |
32 typedef struct { | |
33 int nb_frames; | |
34 } FilmstripMuxContext; | |
35 | |
36 static int write_header(AVFormatContext *s) | |
37 { | |
38 if (s->streams[0]->codec->pix_fmt != PIX_FMT_RGBA) { | |
39 av_log(s, AV_LOG_ERROR, "only PIX_FMT_RGBA is supported\n"); | |
40 return AVERROR_INVALIDDATA; | |
41 } | |
42 return 0; | |
43 } | |
44 | |
45 static int write_packet(AVFormatContext *s, AVPacket *pkt) | |
46 { | |
47 FilmstripMuxContext *film = s->priv_data; | |
48 put_buffer(s->pb, pkt->data, pkt->size); | |
49 film->nb_frames++; | |
50 return 0; | |
51 } | |
52 | |
53 static int write_trailer(AVFormatContext *s) | |
54 { | |
55 FilmstripMuxContext *film = s->priv_data; | |
56 ByteIOContext *pb = s->pb; | |
57 AVStream *st = s->streams[0]; | |
58 int i; | |
59 | |
60 put_be32(pb, RAND_TAG); | |
61 put_be32(pb, film->nb_frames); | |
62 put_be16(pb, 0); // packing method | |
63 put_be16(pb, 0); // reserved | |
64 put_be16(pb, st->codec->width); | |
65 put_be16(pb, st->codec->height); | |
66 put_be16(pb, 0); // leading | |
67 put_be16(pb, 1/av_q2d(st->codec->time_base)); | |
68 for (i = 0; i < 16; i++) | |
69 put_byte(pb, 0x00); // reserved | |
70 put_flush_packet(pb); | |
71 return 0; | |
72 } | |
73 | |
74 AVOutputFormat filmstrip_muxer = { | |
75 "filmstrip", | |
76 NULL_IF_CONFIG_SMALL("Adobe Filmstrip"), | |
77 NULL, | |
78 "flm", | |
79 sizeof(FilmstripMuxContext), | |
80 CODEC_ID_NONE, | |
81 CODEC_ID_RAWVIDEO, | |
82 write_header, | |
83 write_packet, | |
84 write_trailer, | |
85 }; |