1 /*****************************************************************************
2 * dc1394.c: IIDC (DCAM) FireWire input module
3 *****************************************************************************
4 * Copyright (C) 2006-2009 VideoLAN
6 * Authors: Xant Majere <xant@xant.net>
7 * Rob Shortt <rob@tvcentric.com> - libdc1394 V2 API updates
8 * Frederic Benoist <fridorik@gmail.com> - updates from Rob's work
10 *****************************************************************************
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU Lesser General Public License as published by
14 * the Free Software Foundation; either version 2.1 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public License
23 * along with this program; if not, write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 *****************************************************************************/
27 /*****************************************************************************
29 *****************************************************************************/
35 #include <vlc_common.h>
36 #include <vlc_plugin.h>
37 #include <vlc_demux.h>
39 #include <dc1394/dc1394.h>
41 #define MAX_IEEE1394_HOSTS 32
42 #define MAX_CAMERA_NODES 32
44 /*****************************************************************************
46 *****************************************************************************/
47 static int Open ( vlc_object_t
* );
48 static void Close( vlc_object_t
* );
51 set_shortname( N_("DC1394") )
52 set_description( N_("IIDC Digital Camera (FireWire) input") )
53 set_capability( "access_demux", 10 )
54 set_callbacks( Open
, Close
)
60 dc1394_t
*p_dccontext
;
62 dc1394camera_t
*camera
;
64 uint64_t selected_uid
;
66 dc1394featureset_t features
;
71 dc1394video_mode_t video_mode
;
76 unsigned int brightness
;
78 es_out_id_t
*p_es_video
;
79 dc1394video_frame_t
*frame
;
82 /*****************************************************************************
84 *****************************************************************************/
85 static int Demux( demux_t
*p_demux
);
86 static int Control( demux_t
*, int, va_list );
87 static block_t
*GrabVideo( demux_t
*p_demux
);
88 static int process_options( demux_t
*p_demux
);
90 /*****************************************************************************
92 *****************************************************************************/
93 static int FindCamera( demux_sys_t
*sys
, demux_t
*p_demux
)
95 dc1394camera_list_t
*list
;
96 int i_ret
= VLC_EGENERIC
;
98 msg_Dbg( p_demux
, "Scanning for ieee1394 ports ..." );
100 if( dc1394_camera_enumerate (sys
->p_dccontext
, &list
) != DC1394_SUCCESS
)
102 msg_Err(p_demux
, "Can not ennumerate cameras");
108 msg_Err(p_demux
, "Can not find cameras");
112 sys
->num_cameras
= list
->num
;
113 msg_Dbg( p_demux
, "Found %d dc1394 cameras.", list
->num
);
115 if( sys
->selected_uid
)
118 for( unsigned i
= 0; i
< sys
->num_cameras
; i
++ )
120 if( list
->ids
[i
].guid
== sys
->selected_uid
)
122 sys
->camera
= dc1394_camera_new(sys
->p_dccontext
,
130 msg_Err( p_demux
, "Can't find camera with uid : 0x%"PRIx64
".",
135 else if( sys
->selected_camera
>= (int)list
->num
)
137 msg_Err( p_demux
, "There are not this many cameras. (%d/%d)",
138 sys
->selected_camera
, sys
->num_cameras
);
141 else if( sys
->selected_camera
>= 0 )
143 sys
->camera
= dc1394_camera_new(sys
->p_dccontext
,
144 list
->ids
[sys
->selected_camera
].guid
);
148 sys
->camera
= dc1394_camera_new(sys
->p_dccontext
,
155 dc1394_camera_free_list (list
);
159 /*****************************************************************************
161 *****************************************************************************/
162 static int Open( vlc_object_t
*p_this
)
164 demux_t
*p_demux
= (demux_t
*)p_this
;
169 if( strncmp(p_demux
->psz_access
, "dc1394", 6) != 0 )
173 p_demux
->pf_demux
= Demux
;
174 p_demux
->pf_control
= Control
;
175 p_demux
->info
.i_update
= 0;
176 p_demux
->info
.i_title
= 0;
177 p_demux
->info
.i_seekpoint
= 0;
179 p_demux
->p_sys
= p_sys
= vlc_calloc( p_this
, 1, sizeof( demux_sys_t
) );
183 memset( &fmt
, 0, sizeof( es_format_t
) );
186 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_YUV422
;
189 p_sys
->frame_rate
= DC1394_FRAMERATE_15
;
190 p_sys
->brightness
= 200;
192 p_sys
->p_dccontext
= NULL
;
193 p_sys
->camera
= NULL
;
194 p_sys
->selected_camera
= -1;
195 p_sys
->dma_buffers
= 1;
196 p_sys
->reset_bus
= 0;
198 /* PROCESS INPUT OPTIONS */
199 if( process_options(p_demux
) != VLC_SUCCESS
)
201 msg_Err( p_demux
, "Bad MRL, please check the option line "
203 p_demux
->psz_location
);
207 p_sys
->p_dccontext
= dc1394_new();
208 if( !p_sys
->p_dccontext
)
210 msg_Err( p_demux
, "Failed to initialise libdc1394");
214 if( FindCamera( p_sys
, p_demux
) != VLC_SUCCESS
)
216 dc1394_free( p_sys
->p_dccontext
);
222 msg_Err( p_demux
, "No camera found !!" );
223 dc1394_free( p_sys
->p_dccontext
);
227 if( p_sys
->reset_bus
)
229 if( dc1394_reset_bus( p_sys
->camera
) != DC1394_SUCCESS
)
231 msg_Err( p_demux
, "Unable to reset IEEE 1394 bus");
235 else msg_Dbg( p_demux
, "Successfully reset IEEE 1394 bus");
238 if( dc1394_camera_reset( p_sys
->camera
) != DC1394_SUCCESS
)
240 msg_Err( p_demux
, "Unable to reset camera");
245 if( dc1394_camera_print_info( p_sys
->camera
,
246 stderr
) != DC1394_SUCCESS
)
248 msg_Err( p_demux
, "Unable to print camera info");
253 if( dc1394_feature_get_all( p_sys
->camera
,
254 &p_sys
->features
) != DC1394_SUCCESS
)
256 msg_Err( p_demux
, "Unable to get feature set");
260 // TODO: only print features if verbosity increased
261 dc1394_feature_print_all(&p_sys
->features
, stderr
);
263 #if 0 //"Note that you need to execute this function only if you use exotic video1394 device names. /dev/video1394, /dev/video1394/* and /dev/video1394-* are automatically recognized." http://damien.douxchamps.net/ieee1394/libdc1394/v2.x/api/capture/
264 if( p_sys
->video_device
)
266 if( dc1394_capture_set_device_filename( p_sys
->camera
,
267 p_sys
->video_device
) != DC1394_SUCCESS
)
269 msg_Err( p_demux
, "Unable to set video device");
278 if( dc1394_feature_set_value( p_sys
->camera
,
279 DC1394_FEATURE_FOCUS
,
280 p_sys
->focus
) != DC1394_SUCCESS
)
282 msg_Err( p_demux
, "Unable to set initial focus to %u",
286 msg_Dbg( p_demux
, "Initial focus set to %u", p_sys
->focus
);
289 if( dc1394_feature_set_value( p_sys
->camera
,
290 DC1394_FEATURE_FOCUS
,
291 p_sys
->brightness
) != DC1394_SUCCESS
)
293 msg_Err( p_demux
, "Unable to set initial brightness to %u",
297 msg_Dbg( p_demux
, "Initial brightness set to %u", p_sys
->brightness
);
299 if( dc1394_video_set_framerate( p_sys
->camera
,
300 p_sys
->frame_rate
) != DC1394_SUCCESS
)
302 msg_Err( p_demux
, "Unable to set framerate");
307 if( dc1394_video_set_mode( p_sys
->camera
,
308 p_sys
->video_mode
) != DC1394_SUCCESS
)
310 msg_Err( p_demux
, "Unable to set video mode");
315 if( dc1394_video_set_iso_speed( p_sys
->camera
,
316 DC1394_ISO_SPEED_400
) != DC1394_SUCCESS
)
318 msg_Err( p_demux
, "Unable to set iso speed");
323 /* and setup capture */
324 res
= dc1394_capture_setup( p_sys
->camera
,
326 DC1394_CAPTURE_FLAGS_DEFAULT
);
327 if( res
!= DC1394_SUCCESS
)
329 if( res
== DC1394_NO_BANDWIDTH
)
331 msg_Err( p_demux
,"No bandwidth: try adding the "
332 "\"resetbus\" option" );
336 msg_Err( p_demux
,"Unable to setup capture" );
342 /* TODO - UYV444 chroma converter is missing, when it will be available
343 * fourcc will become variable (and not just a fixed value for UYVY)
345 es_format_Init( &fmt
, VIDEO_ES
, VLC_CODEC_UYVY
);
347 fmt
.video
.i_width
= p_sys
->width
;
348 fmt
.video
.i_height
= p_sys
->height
;
350 msg_Dbg( p_demux
, "Added new video es %4.4s %dx%d",
351 (char*)&fmt
.i_codec
, fmt
.video
.i_width
, fmt
.video
.i_height
);
353 p_sys
->p_es_video
= es_out_Add( p_demux
->out
, &fmt
);
355 /* have the camera start sending us data */
356 if( dc1394_video_set_transmission( p_sys
->camera
,
357 DC1394_ON
) != DC1394_SUCCESS
)
359 msg_Err( p_demux
, "Unable to start camera iso transmission" );
360 dc1394_capture_stop( p_sys
->camera
);
364 msg_Dbg( p_demux
, "Set iso transmission" );
365 // TODO: reread camera
369 /*****************************************************************************
371 *****************************************************************************/
372 static void Close( vlc_object_t
*p_this
)
374 demux_t
*p_demux
= (demux_t
*)p_this
;
375 demux_sys_t
*p_sys
= p_demux
->p_sys
;
377 /* Stop data transmission */
378 if( dc1394_video_set_transmission( p_sys
->camera
,
379 DC1394_OFF
) != DC1394_SUCCESS
)
380 msg_Err( p_demux
, "Unable to stop camera iso transmission" );
383 dc1394_capture_stop( p_sys
->camera
);
385 dc1394_camera_free(p_sys
->camera
);
386 dc1394_free(p_sys
->p_dccontext
);
388 free( p_sys
->video_device
);
392 static void MovePixelUYVY( void *src
, int spos
, void *dst
, int dpos
)
398 sc
= (u_char
*)src
+ (spos
*2);
411 dc
= (u_char
*)dst
+(dpos
*2);
425 /*****************************************************************************
427 *****************************************************************************/
428 static block_t
*GrabVideo( demux_t
*p_demux
)
430 demux_sys_t
*p_sys
= p_demux
->p_sys
;
431 block_t
*p_block
= NULL
;
433 if( dc1394_capture_dequeue( p_sys
->camera
,
434 DC1394_CAPTURE_POLICY_WAIT
,
435 &p_sys
->frame
) != DC1394_SUCCESS
)
437 msg_Err( p_demux
, "Unable to capture a frame" );
441 p_block
= block_Alloc( p_sys
->frame
->size
[0] * p_sys
->frame
->size
[1] * 2 );
444 msg_Err( p_demux
, "Can not get block" );
448 if( !p_sys
->frame
->image
)
450 msg_Err (p_demux
, "Capture buffer empty");
451 block_Release( p_block
);
455 memcpy( p_block
->p_buffer
, (const char *)p_sys
->frame
->image
,
456 p_sys
->width
* p_sys
->height
* 2 );
458 p_block
->i_pts
= p_block
->i_dts
= mdate();
459 dc1394_capture_enqueue( p_sys
->camera
, p_sys
->frame
);
463 static int Demux( demux_t
*p_demux
)
465 demux_sys_t
*p_sys
= p_demux
->p_sys
;
466 block_t
*p_blockv
= NULL
;
468 /* Try grabbing video frame */
469 p_blockv
= GrabVideo( p_demux
);
473 /* Sleep so we do not consume all the cpu, 10ms seems
474 * like a good value (100fps)
482 es_out_SetPCR( p_demux
->out
, p_blockv
->i_pts
);
483 es_out_Send( p_demux
->out
, p_sys
->p_es_video
, p_blockv
);
488 /*****************************************************************************
490 *****************************************************************************/
491 static int Control( demux_t
*p_demux
, int i_query
, va_list args
)
493 VLC_UNUSED( p_demux
);
496 /* Special for access_demux */
497 case DEMUX_CAN_PAUSE
:
499 case DEMUX_CAN_CONTROL_PACE
:
500 *va_arg( args
, bool * ) = false;
503 case DEMUX_GET_PTS_DELAY
:
504 *va_arg( args
, int64_t * ) = (int64_t)DEFAULT_PTS_DELAY
;
508 *va_arg( args
, int64_t * ) = mdate();
511 /* TODO implement others */
518 static int process_options( demux_t
*p_demux
)
520 demux_sys_t
*p_sys
= p_demux
->p_sys
;
525 const char *in_size
= NULL
;
526 const char *in_fmt
= NULL
;
529 psz_dup
= strdup( p_demux
->psz_location
);
530 psz_parser
= psz_dup
;
531 for( token
= strtok_r( psz_parser
,":",&state
); token
;
532 token
= strtok_r( NULL
, ":", &state
) )
534 if( strncmp( token
, "size=", strlen("size=") ) == 0 )
536 token
+= strlen("size=");
537 if( strncmp( token
, "160x120", 7 ) == 0 )
539 /* TODO - UYV444 chroma converter is needed ...
540 * video size of 160x120 is temporarily disabled
543 "video size of 160x120 is actually disabled for lack of"
544 "chroma support. It will be released ASAP, until then try "
545 "an higher size (320x240 and 640x480 are fully supported)" );
554 else if( strncmp( token
, "320x240", 7 ) == 0 )
560 else if( strncmp( token
, "640x480", 7 ) == 0 )
569 "This program currently suppots frame sizes of"
570 " 160x120, 320x240, and 640x480. "
571 "Please specify one of them. You have specified %s.",
576 msg_Dbg( p_demux
, "Requested video size : %s",token
);
578 if( strncmp( token
, "format=", strlen("format=") ) == 0 )
580 token
+= strlen("format=");
581 if( strncmp( token
, "YUV411", 6 ) == 0 )
585 else if( strncmp( token
, "YUV422", 6 ) == 0 )
589 else if( strncmp( token
, "YUV444", 6 ) == 0 )
593 else if( strncmp( token
, "RGB8", 4 ) == 0 )
597 else if( strncmp( token
, "MONO8", 5 ) == 0 )
601 else if( strncmp( token
, "MONO16", 6 ) == 0 )
607 msg_Err( p_demux
, "Invalid format %s.", token
);
611 msg_Dbg( p_demux
, "Requested video format : %s", token
);
613 else if( strncmp( token
, "fps=", strlen( "fps=" ) ) == 0 )
615 token
+= strlen("fps=");
616 sscanf( token
, "%g", &rate_f
);
617 if( rate_f
== 1.875 )
618 p_sys
->frame_rate
= DC1394_FRAMERATE_1_875
;
619 else if( rate_f
== 3.75 )
620 p_sys
->frame_rate
= DC1394_FRAMERATE_3_75
;
621 else if( rate_f
== 7.5 )
622 p_sys
->frame_rate
= DC1394_FRAMERATE_7_5
;
623 else if( rate_f
== 15 )
624 p_sys
->frame_rate
= DC1394_FRAMERATE_15
;
625 else if( rate_f
== 30 )
626 p_sys
->frame_rate
= DC1394_FRAMERATE_30
;
627 else if( rate_f
== 60 )
628 p_sys
->frame_rate
= DC1394_FRAMERATE_60
;
632 "This program supports framerates of"
633 " 1.875, 3.75, 7.5, 15, 30, 60. "
634 "Please specify one of them. You have specified %s.",
639 msg_Dbg( p_demux
, "Requested frame rate : %s",token
);
641 else if( strncmp( token
, "resetbus", strlen( "resetbus" ) ) == 0 )
643 token
+= strlen("resetbus");
644 p_sys
->reset_bus
= 1;
646 else if( strncmp( token
, "brightness=", strlen( "brightness=" ) ) == 0 )
649 token
+= strlen("brightness=");
650 nr
= sscanf( token
, "%u", &p_sys
->brightness
);
653 msg_Err( p_demux
, "Bad brightness value '%s', "
654 "must be an unsigned integer.",
660 else if( strncmp( token
, "buffers=", strlen( "buffers=" ) ) == 0 )
664 token
+= strlen("buffers=");
665 nr
= sscanf( token
, "%d", &in_buf
);
666 if( nr
!= 1 || in_buf
< 1 )
668 msg_Err( p_demux
, "DMA buffers must be 1 or greater." );
672 else p_sys
->dma_buffers
= in_buf
;
675 // NOTE: If controller support is added back, more logic will needed to be added
676 // after the cameras are scanned.
677 else if( strncmp( token
, "controller=", strlen( "controller=" ) ) == 0 )
680 token
+= strlen("controller=");
681 nr
= sscanf( token
, "%u", &p_sys
->controller
);
684 msg_Err(p_demux
, "Bad controller value '%s', "
685 "must be an unsigned integer.",
691 else if( strncmp( token
, "camera=", strlen( "camera=" ) ) == 0 )
694 token
+= strlen("camera=");
695 nr
= sscanf(token
,"%u",&p_sys
->selected_camera
);
698 msg_Err( p_demux
, "Bad camera number '%s', "
699 "must be an unsigned integer.",
705 else if( strncmp( token
, "vdev=", strlen( "vdev=" ) ) == 0)
707 token
+= strlen("vdev=");
708 p_sys
->video_device
= strdup(token
);
709 msg_Dbg( p_demux
, "Using video device '%s'.", token
);
711 else if( strncmp( token
, "focus=", strlen("focus=" ) ) == 0)
714 token
+= strlen("focus=");
715 nr
= sscanf( token
, "%u", &p_sys
->focus
);
718 msg_Err( p_demux
, "Bad focus value '%s', "
719 "must be an unsigned integer.",
725 else if( strncmp( token
, "uid=", strlen("uid=") ) == 0)
727 token
+= strlen("uid=");
728 sscanf( token
, "0x%"SCNx64
, &p_sys
->selected_uid
);
732 // The mode is a combination of size and format and not every format
733 // is supported by every size.
736 if( strcmp( in_size
, "160x120") == 0)
738 if( in_fmt
&& (strcmp( in_fmt
, "YUV444") != 0) )
739 msg_Err(p_demux
, "160x120 only supports YUV444 - forcing");
740 p_sys
->video_mode
= DC1394_VIDEO_MODE_160x120_YUV444
;
742 else if( strcmp( in_size
, "320x240") == 0)
744 if( in_fmt
&& (strcmp( in_fmt
, "YUV422") != 0) )
745 msg_Err(p_demux
, "320x240 only supports YUV422 - forcing");
746 p_sys
->video_mode
= DC1394_VIDEO_MODE_320x240_YUV422
;
753 if( strcmp( in_fmt
, "RGB8") == 0)
754 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_RGB8
;
755 else if( strcmp( in_fmt
, "MONO8") == 0)
756 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_MONO8
;
757 else if( strcmp( in_fmt
, "MONO16") == 0)
758 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_MONO16
;
759 else if( strcmp( in_fmt
, "YUV411") == 0)
760 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_YUV411
;
761 else // YUV422 default
762 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_YUV422
;
764 else // YUV422 default
765 p_sys
->video_mode
= DC1394_VIDEO_MODE_640x480_YUV422
;