tv standard selection support for dv1394 and grab (v4l)
authorAlex Beregszaszi <alex@rtfs.hu>
Wed, 25 Jun 2003 10:21:45 +0000 (10:21 +0000)
committerAlex Beregszaszi <alex@rtfs.hu>
Wed, 25 Jun 2003 10:21:45 +0000 (10:21 +0000)
Originally committed as revision 1987 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c
libavformat/avformat.h
libavformat/dv1394.c
libavformat/grab.c

index f39c24e..3812f32 100644 (file)
--- 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", 
index e7dab88..29ca987 100644 (file)
@@ -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 */
index 5e8b83d..0e373a3 100644 (file)
@@ -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;
index 3a99704..cd4b8fe 100644 (file)
@@ -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;