comparison filmstripenc.c @ 5547:ba6b1ac2bab6 libavformat

Adobe Filmstrip muxer and demuxer
author pross
date Thu, 14 Jan 2010 12:55:44 +0000
parents
children 178de7695c6c
comparison
equal deleted inserted replaced
5546:4f6eb8fc81ec 5547:ba6b1ac2bab6
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 /**
23 * @file libavformat/filmstripenc.c
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 };