aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2011-05-24 09:02:11 +0200
committerAnton Khirnov <anton@khirnov.net>2011-05-27 23:33:51 +0200
commit2a85f218680832bc8a22155c8d5225bdb9c10279 (patch)
tree8b86f77d36643d9d377a6e27e3171bb843031b2f /libavformat
parentd576bbf3eb0eb2a421f0c3efb2b78a47a1826cf5 (diff)
downloadffmpeg-2a85f218680832bc8a22155c8d5225bdb9c10279.tar.gz
rawdec: add a pixel_format private option.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/rawdec.c29
-rw-r--r--libavformat/rawdec.h1
2 files changed, 20 insertions, 10 deletions
diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c
index 434ed48f05..4f974d7045 100644
--- a/libavformat/rawdec.c
+++ b/libavformat/rawdec.c
@@ -25,6 +25,7 @@
#include "rawdec.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
+#include "libavutil/pixdesc.h"
/* raw input */
int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
@@ -70,30 +71,37 @@ int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
case AVMEDIA_TYPE_VIDEO: {
FFRawVideoDemuxerContext *s1 = s->priv_data;
int width = 0, height = 0, ret;
+ enum PixelFormat pix_fmt;
+
if(ap->time_base.num)
av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
else
av_set_pts_info(st, 64, 1, 25);
- if (s1->video_size) {
- ret = av_parse_video_size(&width, &height, s1->video_size);
- av_freep(&s1->video_size);
- if (ret < 0) {
- av_log(s, AV_LOG_ERROR, "Couldn't parse video size.\n");
- return ret;
- }
+ if (s1->video_size && (ret = av_parse_video_size(&width, &height, s1->video_size)) < 0) {
+ av_log(s, AV_LOG_ERROR, "Couldn't parse video size.\n");
+ goto fail;
+ }
+ if ((pix_fmt = av_get_pix_fmt(s1->pixel_format)) == PIX_FMT_NONE) {
+ av_log(s, AV_LOG_ERROR, "No such pixel format: %s.\n", s1->pixel_format);
+ ret = AVERROR(EINVAL);
+ goto fail;
}
#if FF_API_FORMAT_PARAMETERS
if (ap->width > 0)
width = ap->width;
if (ap->height > 0)
height = ap->height;
+ if (ap->pix_fmt)
+ pix_fmt = ap->pix_fmt;
#endif
st->codec->width = width;
st->codec->height = height;
- st->codec->pix_fmt = ap->pix_fmt;
- if(st->codec->pix_fmt == PIX_FMT_NONE)
- st->codec->pix_fmt= PIX_FMT_YUV420P;
+ st->codec->pix_fmt = pix_fmt;
break;
+fail:
+ av_freep(&s1->video_size);
+ av_freep(&s1->pixel_format);
+ return ret;
}
default:
return -1;
@@ -187,6 +195,7 @@ const AVClass ff_rawaudio_demuxer_class = {
#define DEC AV_OPT_FLAG_DECODING_PARAM
static const AVOption video_options[] = {
{ "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
+ { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC },
{ NULL },
};
#undef OFFSET
diff --git a/libavformat/rawdec.h b/libavformat/rawdec.h
index 99beadd0e1..4968915cc6 100644
--- a/libavformat/rawdec.h
+++ b/libavformat/rawdec.h
@@ -34,6 +34,7 @@ typedef struct RawAudioDemuxerContext {
typedef struct FFRawVideoDemuxerContext {
const AVClass *class; /**< Class for private options. */
char *video_size; /**< String describing video size, set by a private option. */
+ char *pixel_format; /**< Set by a private option. */
} FFRawVideoDemuxerContext;
extern const AVClass ff_rawaudio_demuxer_class;