3 * Copyright (c) 2001 Fabrice Bellard
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/imgutils.h"
23 #include "libavutil/parseutils.h"
24 #include "libavutil/pixdesc.h"
25 #include "libavutil/opt.h"
29 typedef struct RawVideoDemuxerContext
{
30 const AVClass
*class; /**< Class for private options. */
31 int width
, height
; /**< Integers describing video size, set by a private option. */
32 char *pixel_format
; /**< Set by a private option. */
33 AVRational framerate
; /**< AVRational describing framerate, set by a private option. */
34 } RawVideoDemuxerContext
;
37 static int rawvideo_read_header(AVFormatContext
*ctx
)
39 RawVideoDemuxerContext
*s
= ctx
->priv_data
;
40 enum AVPixelFormat pix_fmt
;
44 st
= avformat_new_stream(ctx
, NULL
);
46 return AVERROR(ENOMEM
);
48 st
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
50 st
->codecpar
->codec_id
= ctx
->iformat
->raw_codec_id
;
52 if ((pix_fmt
= av_get_pix_fmt(s
->pixel_format
)) == AV_PIX_FMT_NONE
) {
53 av_log(ctx
, AV_LOG_ERROR
, "No such pixel format: %s.\n",
55 return AVERROR(EINVAL
);
58 avpriv_set_pts_info(st
, 64, s
->framerate
.den
, s
->framerate
.num
);
60 st
->codecpar
->width
= s
->width
;
61 st
->codecpar
->height
= s
->height
;
62 st
->codecpar
->format
= pix_fmt
;
63 packet_size
= av_image_get_buffer_size(st
->codecpar
->format
, s
->width
, s
->height
, 1);
66 ctx
->packet_size
= packet_size
;
67 st
->codecpar
->bit_rate
= av_rescale_q(ctx
->packet_size
,
68 (AVRational
){8,1}, st
->time_base
);
74 static int rawvideo_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
78 ret
= av_get_packet(s
->pb
, pkt
, s
->packet_size
);
79 pkt
->pts
= pkt
->dts
= pkt
->pos
/ s
->packet_size
;
81 pkt
->stream_index
= 0;
87 #define OFFSET(x) offsetof(RawVideoDemuxerContext, x)
88 #define DEC AV_OPT_FLAG_DECODING_PARAM
89 static const AVOption rawvideo_options
[] = {
90 { "video_size", "set frame size", OFFSET(width
), AV_OPT_TYPE_IMAGE_SIZE
, {.str
= NULL
}, 0, 0, DEC
},
91 { "pixel_format", "set pixel format", OFFSET(pixel_format
), AV_OPT_TYPE_STRING
, {.str
= "yuv420p"}, 0, 0, DEC
},
92 { "framerate", "set frame rate", OFFSET(framerate
), AV_OPT_TYPE_VIDEO_RATE
, {.str
= "25"}, 0, INT_MAX
, DEC
},
96 static const AVClass rawvideo_demuxer_class
= {
97 .class_name
= "rawvideo demuxer",
98 .item_name
= av_default_item_name
,
99 .option
= rawvideo_options
,
100 .version
= LIBAVUTIL_VERSION_INT
,
103 AVInputFormat ff_rawvideo_demuxer
= {
105 .long_name
= NULL_IF_CONFIG_SMALL("raw video"),
106 .priv_data_size
= sizeof(RawVideoDemuxerContext
),
107 .read_header
= rawvideo_read_header
,
108 .read_packet
= rawvideo_read_packet
,
109 .flags
= AVFMT_GENERIC_INDEX
,
110 .extensions
= "yuv,cif,qcif,rgb",
111 .raw_codec_id
= AV_CODEC_ID_RAWVIDEO
,
112 .priv_class
= &rawvideo_demuxer_class
,