From e3ee328330e924e6524003a6e082934fddb87a44 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 25 Jun 2003 10:21:45 +0000 Subject: [PATCH] tv standard selection support for dv1394 and grab (v4l) Originally committed as revision 1987 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 8 ++++++++ libavformat/avformat.h | 1 + libavformat/dv1394.c | 6 ++++-- libavformat/grab.c | 12 ++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index f39c24e..3812f32 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -159,6 +159,7 @@ static int rate_emu = 0; static char *video_grab_format = "video4linux"; static char *video_device = NULL; static int video_channel = 0; +static char *video_standard = "ntsc"; static char *audio_grab_format = "audio_device"; static char *audio_device = NULL; @@ -1858,6 +1859,11 @@ static void opt_video_channel(const char *arg) video_channel = strtol(arg, NULL, 0); } +static void opt_video_standard(const char *arg) +{ + video_standard = av_strdup(arg); +} + static void opt_audio_device(const char *arg) { audio_device = av_strdup(arg); @@ -2457,6 +2463,7 @@ static void prepare_grab(void) fmt1 = av_find_input_format(video_grab_format); vp->device = video_device; vp->channel = video_channel; + vp->standard = video_standard; if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) { fprintf(stderr, "Could not find video grab device\n"); exit(1); @@ -2644,6 +2651,7 @@ const OptionDef options[] = { { "bufsize", HAS_ARG, {(void*)opt_video_buffer_size}, "set ratecontrol buffere size (in kbit)", "size" }, { "vd", HAS_ARG | OPT_EXPERT, {(void*)opt_video_device}, "set video grab device", "device" }, { "vc", HAS_ARG | OPT_EXPERT, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" }, + { "tvstd", HAS_ARG | OPT_EXPERT, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" }, { "dv1394", OPT_EXPERT, {(void*)opt_dv1394}, "set DV1394 grab", "" }, { "vcodec", HAS_ARG | OPT_EXPERT, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" }, { "me", HAS_ARG | OPT_EXPERT, {(void*)opt_motion_estimation}, "set motion estimation method", diff --git a/libavformat/avformat.h b/libavformat/avformat.h index e7dab88..29ca987 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -86,6 +86,7 @@ typedef struct AVFormatParameters { struct AVImageFormat *image_format; int channel; /* used to select dv channel */ const char *device; /* video4linux, audio or DV device */ + const char *standard; /* tv standard, NTSC, PAL, SECAM */ } AVFormatParameters; #define AVFMT_NOFILE 0x0001 /* no file should be opened */ diff --git a/libavformat/dv1394.c b/libavformat/dv1394.c index 5e8b83d..0e373a3 100644 --- a/libavformat/dv1394.c +++ b/libavformat/dv1394.c @@ -91,8 +91,10 @@ static int dv1394_read_header(AVFormatContext * context, AVFormatParameters * ap return -ENOMEM; } - /* FIXME: Need a format change parameter */ - dv->format = DV1394_NTSC; + if (ap->standard && !strcasecmp(ap->standard, "pal")) + dv->format = DV1394_PAL; + else + dv->format = DV1394_NTSC; if (ap->channel) dv->channel = ap->channel; diff --git a/libavformat/grab.c b/libavformat/grab.c index 3a99704..cd4b8fe 100644 --- a/libavformat/grab.c +++ b/libavformat/grab.c @@ -62,6 +62,7 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap) int video_fd, frame_size; int ret, frame_rate, frame_rate_base; int desired_palette; + struct video_tuner tuner; struct video_audio audio; const char *video_device; @@ -109,6 +110,17 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap) } else if (st->codec.pix_fmt == PIX_FMT_BGR24) { desired_palette = VIDEO_PALETTE_RGB24; } + + /* set tv standard */ + if (ap->standard && !ioctl(video_fd, VIDIOCGTUNER, &tuner)) { + if (!strcasecmp(ap->standard, "pal")) + tuner.mode = VIDEO_MODE_PAL; + else if (!strcasecmp(ap->standard, "secam")) + tuner.mode = VIDEO_MODE_SECAM; + else + tuner.mode = VIDEO_MODE_NTSC; + ioctl(video_fd, VIDIOCSTUNER, &tuner); + } /* unmute audio */ audio.audio = 0; -- 2.7.4