From owner-freebsd-multimedia Sun Oct 5 03:45:45 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id DAA12259 for multimedia-outgoing; Sun, 5 Oct 1997 03:45:45 -0700 (PDT) Received: from gaia.coppe.ufrj.br (jonny@[146.164.5.200]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id DAA12253 for ; Sun, 5 Oct 1997 03:45:36 -0700 (PDT) Received: (from jonny@localhost) by gaia.coppe.ufrj.br (8.8.7/8.8.7) id HAA11860; Sun, 5 Oct 1997 07:45:33 -0300 (EST) From: Joao Carlos Mendes Luis Message-Id: <199710051045.HAA11860@gaia.coppe.ufrj.br> Subject: Proposed patches to fxtv To: multimedia@freebsd.org Date: Sun, 5 Oct 1997 07:45:33 -0300 (EST) X-Mailer: ELM [version 2.4ME+ PL32 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-freebsd-multimedia@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Hi, Here are the patches I have done to fxtv 0.44 to support my changes to the bt848 driver. It's just a test patch,, with a not so good interface so it should be completely redesigned. I know nothing about X programming, so please don't flame me for programming style. After understanding how the bt848 chip works, it took me 10 minutes to patch the kernel, and a whole night to patch fxtv. :) Randall, could you please take a look on this and make any changes you want ? I'd like to see support for this integrated in some future version of fxtv, so that I can (also) work and watch TV at the same time. :) Jonny -- Joao Carlos Mendes Luis jonny@gta.ufrj.br +55 21 290-4698 jonny@coppe.ufrj.br Universidade Federal do Rio de Janeiro UFRJ/COPPE/CISI PGP fingerprint: 29 C0 50 B9 B6 3E 58 F2 83 5F E3 26 BF 0F EA 67 --- org/tvcapture.h Wed Sep 3 20:25:52 1997 +++ tvcapture.h Sun Oct 5 06:44:03 1997 @@ -57,9 +57,14 @@ } TV_INPUT_DEVICE; typedef enum { - TV_INPUT_NTSC, - TV_INPUT_PAL, - TV_INPUT_AUTO + TV_INPUT_AUTO, + TV_INPUT_NTSCM, + TV_INPUT_NTSCJ, + TV_INPUT_PALBDGHI, + TV_INPUT_PALM, + TV_INPUT_PALN, + TV_INPUT_SECAM, + TV_INPUT_PALNCOMB } TV_INPUT_FORMAT; typedef enum { --- org/tv.c Sun Sep 7 20:48:45 1997 +++ tv.c Sun Oct 5 07:17:04 1997 @@ -199,6 +199,24 @@ { TV_FREQ_SET_WEUROPE , "weurope" }, { TV_FREQ_SET_JPNBCST , "jpnbcst" }, }; + static const struct { + TV_INPUT_FORMAT mode; + const char *str; + } formats[] = { + { TV_INPUT_AUTO, "auto" }, + { TV_INPUT_NTSCM, "ntsc" }, + { TV_INPUT_NTSCM, "ntscm" }, + { TV_INPUT_NTSCJ, "ntscj" }, + { TV_INPUT_PALBDGHI, "palbdghi" }, + { TV_INPUT_PALBDGHI, "pal" }, + { TV_INPUT_PALM, "palm" }, + { TV_INPUT_PALN, "paln" }, + { TV_INPUT_SECAM, "secam" }, + { TV_INPUT_PALNCOMB, "palncomb" }, + { TV_INPUT_PALNCOMB, "rsvd" }, + { 0, NULL } + }; + TV_DISK *dsk = &G_glob.disk; TV_DISPLAY *d = &G_glob.display; @@ -218,10 +236,12 @@ if ( !App_res.driver_defaults ) { /* Input format */ - input_format = TV_INPUT_NTSC; - if (( strcmp( App_res.input_format, "pal" ) == 0 ) || - ( strcmp( App_res.input_format, "PAL" ) == 0 )) - input_format = TV_INPUT_PAL; + input_format = TV_INPUT_NTSCM; + for ( i = 0 ; formats[i].str == NULL ; ++i ) { + if ( strcasecmp( App_res.input_format, formats[i].str ) == 0 ) { + input_format = formats[i].mode; + } + } TVCAPTURESetInputFormat( c, input_format ); dsk->video.geom.w = c->width_max / 2; --- org/tvcapture.c Sun Sep 7 18:47:06 1997 +++ tvcapture.c Sun Oct 5 06:45:30 1997 @@ -382,27 +382,38 @@ TV_INT32 larg; switch ( format ) { - case TV_INPUT_NTSC : larg = METEOR_FMT_NTSC; break; - case TV_INPUT_PAL : larg = METEOR_FMT_PAL ; break; + case TV_INPUT_AUTO : larg = BT848_IFORM_F_AUTO ; break; + case TV_INPUT_NTSCM : larg = BT848_IFORM_F_NTSCM ; break; + case TV_INPUT_NTSCJ : larg = BT848_IFORM_F_NTSCJ ; break; + case TV_INPUT_PALBDGHI : larg = BT848_IFORM_F_PALBDGHI; break; + case TV_INPUT_PALM : larg = BT848_IFORM_F_PALM ; break; + case TV_INPUT_PALN : larg = BT848_IFORM_F_PALN ; break; + case TV_INPUT_SECAM : larg = BT848_IFORM_F_SECAM ; break; + case TV_INPUT_PALNCOMB : larg = BT848_IFORM_F_RSVD ; break; default : fprintf( stderr, "TVCAPTURESetInputFormat: Unsupported format %d\n", format ); exit(1); } - if ( ioctl( c->fd, METEORSFMT, &larg ) < 0 ) { - DO_IOCTL_SERR( "METEORSFMT", larg ); + if ( ioctl( c->fd, BT848SFMT, &larg ) < 0 ) { + DO_IOCTL_SERR( "BT848SFMT", larg ); return; } /* Update max capture size based on driver format */ /* FIXME: These belong in the driver/driver include file */ switch ( format ) { - case TV_INPUT_NTSC : + case TV_INPUT_NTSCM: + case TV_INPUT_NTSCJ: + case TV_INPUT_PALM: c->width_max = 640; c->height_max = 480; c->fps_max = 30; break; - case TV_INPUT_PAL : + case TV_INPUT_PALBDGHI: + case TV_INPUT_PALN: + case TV_INPUT_SECAM: + case TV_INPUT_PALNCOMB: c->width_max = 768; c->height_max = 576; c->fps_max = 25; @@ -611,14 +622,19 @@ } /* INPUT FORMAT */ - if ( ioctl( c->fd, METEORGFMT, &larg ) < 0 ) { - DO_IOCTL_GERR( "METEORGFMT" ); + if ( ioctl( c->fd, BT848GFMT, &larg ) < 0 ) { + DO_IOCTL_GERR( "BT848GFMT" ); return False; } switch ( larg ) { - case METEOR_FMT_NTSC : s->input_fmt = TV_INPUT_NTSC; break; - case METEOR_FMT_PAL : s->input_fmt = TV_INPUT_PAL ; break; - case METEOR_FMT_AUTOMODE : s->input_fmt = TV_INPUT_AUTO; break; + case BT848_IFORM_F_AUTO : s->input_fmt = TV_INPUT_AUTO ; break; + case BT848_IFORM_F_NTSCM : s->input_fmt = TV_INPUT_NTSCM ; break; + case BT848_IFORM_F_NTSCJ : s->input_fmt = TV_INPUT_NTSCJ ; break; + case BT848_IFORM_F_PALBDGHI: s->input_fmt = TV_INPUT_PALBDGHI; break; + case BT848_IFORM_F_PALM : s->input_fmt = TV_INPUT_PALM ; break; + case BT848_IFORM_F_PALN : s->input_fmt = TV_INPUT_PALN ; break; + case BT848_IFORM_F_SECAM : s->input_fmt = TV_INPUT_SECAM ; break; + case BT848_IFORM_F_RSVD : s->input_fmt = TV_INPUT_PALNCOMB; break; default : fprintf( stderr, "TVCAPTUREQueryDriverState(): Bad FMT %d\n", larg ); @@ -1084,7 +1100,7 @@ exit(1); } - c->input_format = METEOR_FMT_NTSC; + c->input_format = BT848_IFORM_F_NTSCM; c->input_dev = METEOR_INPUT_DEV0; c->bpp_format = METEOR_GEO_RGB16; c->cap_mode = TV_CAPTURE_CONTINUOUS; @@ -1118,12 +1134,13 @@ c->height_min = 2; c->height_res = 2; switch ( c->input_format ) { - case METEOR_FMT_NTSC : + case BT848_IFORM_F_NTSCM : + case BT848_IFORM_F_NTSCJ : + case BT848_IFORM_F_PALM : c->width_max = 640; c->height_max = 480; c->fps_max = 30; break; - case METEOR_FMT_PAL : default : c->width_max = 768; c->height_max = 576; --- org/tvmenu.h Sun Sep 7 12:35:58 1997 +++ tvmenu.h Sun Oct 5 06:53:40 1997 @@ -50,6 +50,14 @@ TV_MENUITEM_INPUT_SVHS, TV_MENUITEM_TMODE_ANTENNA, TV_MENUITEM_TMODE_CABLE, + TV_MENUITEM_FORMAT_AUTO, + TV_MENUITEM_FORMAT_NTSCM, + TV_MENUITEM_FORMAT_NTSCJ, + TV_MENUITEM_FORMAT_PALBDGHI, + TV_MENUITEM_FORMAT_PALM, + TV_MENUITEM_FORMAT_PALN, + TV_MENUITEM_FORMAT_SECAM, + TV_MENUITEM_FORMAT_PALNCOMB, TV_MENUITEM_OPTIONS_ASPECT, TV_MENUITEM_OPTIONS_AFC, TV_MENUITEM_OPTIONS_SAVE, @@ -83,6 +91,8 @@ Widget TVTOOLSGetVolumeScrollbar( void ); void TVMENUSetSelectedInputDevice( TV_INPUT_DEVICE dev ); + +void TVMENUSetSelectedInputFormat( TV_INPUT_FORMAT fmt ); void TVMENUSetSelectedAfcMode( TV_BOOL afc ); --- org/app_rsrc.h Sun Sep 7 21:02:27 1997 +++ app_rsrc.h Sun Oct 5 07:02:43 1997 @@ -423,6 +423,17 @@ "*menuBox*inputMenu*tmodeCable.label: Cable", "*menuBox*inputMenu*appearanceCmd.label: Appearance...", + "*menuBox*formatMenu.label: Format", + "*menuBox*formatMenu.menu.label: Format", + "*menuBox*formatMenu*autoFmt.label: Auto", + "*menuBox*formatMenu*ntscmFmt.label: NTSC/M", + "*menuBox*formatMenu*ntscjFmt.label: NTSC/J", + "*menuBox*formatMenu*palbdghiFmt.label: PAL/BDGHI", + "*menuBox*formatMenu*palmFmt.label: PAL/M", + "*menuBox*formatMenu*palnFmt.label: PAL/N", + "*menuBox*formatMenu*secamFmt.label: SECAM", + "*menuBox*formatMenu*palncombFmt.label: PAL/N Comb", + "*menuBox*optionsMenu.label: Options", "*menuBox*optionsMenu.menu.label: Options", "*menuBox*optionsMenu*aspectLockCmd.label: Aspect Lock", --- org/tvmenu.c Sun Sep 7 12:44:15 1997 +++ tvmenu.c Sun Oct 5 07:08:23 1997 @@ -62,6 +62,7 @@ typedef enum { TV_MENU_FILE = 0, TV_MENU_INPUT, + TV_MENU_FORMAT, TV_MENU_OPTIONS, TV_MENU_HELP, TV_NUM_MENUS @@ -97,7 +98,7 @@ static XT_CB QuitCB, FreezeCB, MuteCB, ZoomCB, InputCB, AfcCB, TModeCB, ChanUpDnCB, AppearCB, AspectCB, AboutCB, ImgSavCB, ImgSavAsCB, - AudSavAsCB, VidSavAsCB; + AudSavAsCB, VidSavAsCB, FormatCB; /* ******************** Private variables ************** */ @@ -112,6 +113,7 @@ static TV_MENU_DEF Menu_def[] = { { TV_MENU_FILE , "fileMenu" }, { TV_MENU_INPUT , "inputMenu" }, + { TV_MENU_FORMAT , "formatMenu" }, { TV_MENU_OPTIONS, "optionsMenu" }, { TV_MENU_HELP , "helpMenu" } }; @@ -137,6 +139,14 @@ { TVMI( INPUT,TMODE_CABLE ), "tmodeCable" , WC_mcmd , TModeCB }, { TV_MENU_INPUT, -1 , "line" , WC_mline, NULL }, { TVMI( INPUT,INPUT_APPEARANCE ), "appearanceCmd" , WC_mcmd , AppearCB }, + { TVMI( FORMAT,FORMAT_AUTO ), "autoFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_NTSCM ), "ntscmFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_NTSCJ ), "ntscjFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_PALBDGHI ), "palbdghiFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_PALM ), "palmFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_PALN ), "palnFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_SECAM ), "secamFmt" , WC_mcmd , FormatCB }, + { TVMI( FORMAT,FORMAT_PALNCOMB ), "palncombFmt" , WC_mcmd , FormatCB }, { TVMI( OPTIONS,OPTIONS_ASPECT ), "aspectLockCmd" , WC_mcmd , AspectCB }, { TVMI( OPTIONS,OPTIONS_AFC ), "setAfcCmd", WC_mcmd , AfcCB }, { TV_MENU_OPTIONS, -1 , "line" , WC_mline, NULL }, @@ -285,6 +295,57 @@ } +/* FormatCB - Change the input format to that selected */ +static void FormatCB( Widget w, XtPointer cl, XtPointer cb ) +{ + static struct { + TV_MENUITEM_KEY key; + TV_INPUT_FORMAT fmt; + } menuitem[] = { + { TV_MENUITEM_FORMAT_AUTO, TV_INPUT_AUTO }, + { TV_MENUITEM_FORMAT_NTSCM, TV_INPUT_NTSCM }, + { TV_MENUITEM_FORMAT_NTSCJ, TV_INPUT_NTSCJ }, + { TV_MENUITEM_FORMAT_PALBDGHI, TV_INPUT_PALBDGHI }, + { TV_MENUITEM_FORMAT_PALM, TV_INPUT_PALM }, + { TV_MENUITEM_FORMAT_PALN, TV_INPUT_PALN }, + { TV_MENUITEM_FORMAT_SECAM, TV_INPUT_SECAM }, + { TV_MENUITEM_FORMAT_PALNCOMB, TV_INPUT_PALNCOMB }, + { -1, -1 } + }; + int i; + + TV_DISPLAY *d = &G_glob.display; + TV_CAPTURE *c = &G_glob.capture; + TV_BOOL on; + TV_INPUT_FORMAT fmt; + + fmt = -1; + for ( i = 0 ; menuitem[i].key != -1 ; ++i ) { + if ( w == LookupMenuItemByKey( menuitem[i].key )->wgt ) { + fmt = menuitem[i].fmt; + break; + } + } + + if ( fmt == -1 ) { + fprintf( stderr, "Unknown input format widget: %s\n", XtName( w ) ); + return; + } + + on = d->enabled && c->contin_on; + + /* Update input device setting */ + if ( on ) + TVSCREENStopVideo( False ); + TVCAPTURESetInputFormat( c, fmt ); + if ( on ) + TVSCREENStartVideo( False ); + + /* Update which menu item is selected */ + TVMENUSetSelectedInputFormat( fmt ); +} + + /* AfcCB - Change the AFC mode */ static void AfcCB( Widget w, XtPointer cl, XtPointer cb ) { @@ -694,6 +755,39 @@ pix = ( dev == TV_DEVICE_SVHS ) ? Select_pixmap : Unselect_pixmap; XtVaSetValues( svhs->wgt , XtNleftBitmap, pix, NULL ); +} + +void TVMENUSetSelectedInputFormat( TV_INPUT_FORMAT fmt ) +{ + /* This struct is EQUAL to FormatCB, maybe it should be a global. */ + static struct { + TV_MENUITEM_KEY key; + TV_INPUT_FORMAT fmt; + } menu[] = { + { TV_MENUITEM_FORMAT_AUTO, TV_INPUT_AUTO }, + { TV_MENUITEM_FORMAT_NTSCM, TV_INPUT_NTSCM }, + { TV_MENUITEM_FORMAT_NTSCJ, TV_INPUT_NTSCJ }, + { TV_MENUITEM_FORMAT_PALBDGHI, TV_INPUT_PALBDGHI }, + { TV_MENUITEM_FORMAT_PALM, TV_INPUT_PALM }, + { TV_MENUITEM_FORMAT_PALN, TV_INPUT_PALN }, + { TV_MENUITEM_FORMAT_SECAM, TV_INPUT_SECAM }, + { TV_MENUITEM_FORMAT_PALNCOMB, TV_INPUT_PALNCOMB }, + { -1, -1 } + }; + TV_MENUITEM_DEF *mi; + Pixmap pix; + int i; + + if ( Select_pixmap == None ) + TVMENULoadRadioPixmaps(); + + for ( i = 0 ; menu[i].key != -1 ; ++i ) { + mi = LookupMenuItemByKey( menu[i].key ); + assert( mi != NULL ); + assert( mi->wgt != NULL ); + pix = ( fmt == menu[i].fmt ) ? Select_pixmap : Unselect_pixmap; + XtVaSetValues( mi->wgt, XtNleftBitmap, pix, NULL); + } } void TVMENUSetSelectedTunerMode( TV_TUNER_MODE mode )