ff_raw_read_header is used only for this demuxer for video.
Luca Barbato authored on 2012/10/24 21:18:49... | ... |
@@ -239,7 +239,7 @@ OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o |
239 | 239 |
OBJS-$(CONFIG_PVA_DEMUXER) += pva.o |
240 | 240 |
OBJS-$(CONFIG_QCP_DEMUXER) += qcp.o |
241 | 241 |
OBJS-$(CONFIG_R3D_DEMUXER) += r3d.o |
242 |
-OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o rawdec.o |
|
242 |
+OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o |
|
243 | 243 |
OBJS-$(CONFIG_RAWVIDEO_MUXER) += rawenc.o |
244 | 244 |
OBJS-$(CONFIG_RL2_DEMUXER) += rl2.o |
245 | 245 |
OBJS-$(CONFIG_RM_DEMUXER) += rmdec.o rm.o rmsipr.o |
... | ... |
@@ -19,8 +19,63 @@ |
19 | 19 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | 20 |
*/ |
21 | 21 |
|
22 |
+#include "libavutil/parseutils.h" |
|
23 |
+#include "libavutil/pixdesc.h" |
|
24 |
+#include "libavutil/opt.h" |
|
25 |
+#include "internal.h" |
|
22 | 26 |
#include "avformat.h" |
23 |
-#include "rawdec.h" |
|
27 |
+ |
|
28 |
+typedef struct RawVideoDemuxerContext { |
|
29 |
+ const AVClass *class; /**< Class for private options. */ |
|
30 |
+ char *video_size; /**< String describing video size, set by a private option. */ |
|
31 |
+ char *pixel_format; /**< Set by a private option. */ |
|
32 |
+ char *framerate; /**< String describing framerate, set by a private option. */ |
|
33 |
+} RawVideoDemuxerContext; |
|
34 |
+ |
|
35 |
+ |
|
36 |
+static int rawvideo_read_header(AVFormatContext *ctx) |
|
37 |
+{ |
|
38 |
+ RawVideoDemuxerContext *s = ctx->priv_data; |
|
39 |
+ int width = 0, height = 0, ret = 0; |
|
40 |
+ enum AVPixelFormat pix_fmt; |
|
41 |
+ AVRational framerate; |
|
42 |
+ AVStream *st; |
|
43 |
+ |
|
44 |
+ st = avformat_new_stream(ctx, NULL); |
|
45 |
+ if (!st) |
|
46 |
+ return AVERROR(ENOMEM); |
|
47 |
+ |
|
48 |
+ st->codec->codec_type = AVMEDIA_TYPE_VIDEO; |
|
49 |
+ |
|
50 |
+ st->codec->codec_id = ctx->iformat->raw_codec_id; |
|
51 |
+ |
|
52 |
+ if (s->video_size && |
|
53 |
+ (ret = av_parse_video_size(&width, &height, s->video_size)) < 0) { |
|
54 |
+ av_log(ctx, AV_LOG_ERROR, "Couldn't parse video size.\n"); |
|
55 |
+ return ret; |
|
56 |
+ } |
|
57 |
+ |
|
58 |
+ if ((pix_fmt = av_get_pix_fmt(s->pixel_format)) == AV_PIX_FMT_NONE) { |
|
59 |
+ av_log(ctx, AV_LOG_ERROR, "No such pixel format: %s.\n", |
|
60 |
+ s->pixel_format); |
|
61 |
+ return AVERROR(EINVAL); |
|
62 |
+ } |
|
63 |
+ |
|
64 |
+ if ((ret = av_parse_video_rate(&framerate, s->framerate)) < 0) { |
|
65 |
+ av_log(ctx, AV_LOG_ERROR, "Could not parse framerate: %s.\n", |
|
66 |
+ s->framerate); |
|
67 |
+ return ret; |
|
68 |
+ } |
|
69 |
+ |
|
70 |
+ avpriv_set_pts_info(st, 64, framerate.den, framerate.num); |
|
71 |
+ |
|
72 |
+ st->codec->width = width; |
|
73 |
+ st->codec->height = height; |
|
74 |
+ st->codec->pix_fmt = pix_fmt; |
|
75 |
+ |
|
76 |
+ return 0; |
|
77 |
+} |
|
78 |
+ |
|
24 | 79 |
|
25 | 80 |
static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) |
26 | 81 |
{ |
... | ... |
@@ -34,9 +89,8 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) |
34 | 34 |
if (packet_size < 0) |
35 | 35 |
return -1; |
36 | 36 |
|
37 |
- ret= av_get_packet(s->pb, pkt, packet_size); |
|
38 |
- pkt->pts= |
|
39 |
- pkt->dts= pkt->pos / packet_size; |
|
37 |
+ ret = av_get_packet(s->pb, pkt, packet_size); |
|
38 |
+ pkt->pts = pkt->dts = pkt->pos / packet_size; |
|
40 | 39 |
|
41 | 40 |
pkt->stream_index = 0; |
42 | 41 |
if (ret < 0) |
... | ... |
@@ -44,7 +98,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) |
44 | 44 |
return 0; |
45 | 45 |
} |
46 | 46 |
|
47 |
-#define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) |
|
47 |
+#define OFFSET(x) offsetof(RawVideoDemuxerContext, x) |
|
48 | 48 |
#define DEC AV_OPT_FLAG_DECODING_PARAM |
49 | 49 |
static const AVOption rawvideo_options[] = { |
50 | 50 |
{ "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, |
... | ... |
@@ -63,8 +117,8 @@ static const AVClass rawvideo_demuxer_class = { |
63 | 63 |
AVInputFormat ff_rawvideo_demuxer = { |
64 | 64 |
.name = "rawvideo", |
65 | 65 |
.long_name = NULL_IF_CONFIG_SMALL("raw video"), |
66 |
- .priv_data_size = sizeof(FFRawVideoDemuxerContext), |
|
67 |
- .read_header = ff_raw_read_header, |
|
66 |
+ .priv_data_size = sizeof(RawVideoDemuxerContext), |
|
67 |
+ .read_header = rawvideo_read_header, |
|
68 | 68 |
.read_packet = rawvideo_read_packet, |
69 | 69 |
.flags = AVFMT_GENERIC_INDEX, |
70 | 70 |
.extensions = "yuv,cif,qcif,rgb", |