@ -2,6 +2,7 @@
* IIDC1394 grab interface ( uses libdc1394 and libraw1394 )
* Copyright ( c ) 2004 Roman Shaposhnik
* Copyright ( c ) 2008 Alessandro Sappia
* Copyright ( c ) 2011 Martin Lambers
*
* This file is part of FFmpeg .
*
@ -21,44 +22,24 @@
*/
# include "config.h"
# include "libavformat/avformat.h"
# include "libavutil/log.h"
# include "libavutil/opt.h"
# include "avdevice.h"
# include <stdlib.h>
# include <string.h>
# include "libavutil/parseutils.h"
# include "libavutil/pixdesc.h"
# if HAVE_LIBDC1394_2
# include <dc1394/dc1394.h>
# elif HAVE_LIBDC1394_1
# include <libraw1394/raw1394.h>
# include <libdc1394/dc1394_control.h>
# define DC1394_VIDEO_MODE_320x240_YUV422 MODE_320x240_YUV422
# define DC1394_VIDEO_MODE_640x480_YUV411 MODE_640x480_YUV411
# define DC1394_VIDEO_MODE_640x480_YUV422 MODE_640x480_YUV422
# define DC1394_FRAMERATE_1_875 FRAMERATE_1_875
# define DC1394_FRAMERATE_3_75 FRAMERATE_3_75
# define DC1394_FRAMERATE_7_5 FRAMERATE_7_5
# define DC1394_FRAMERATE_15 FRAMERATE_15
# define DC1394_FRAMERATE_30 FRAMERATE_30
# define DC1394_FRAMERATE_60 FRAMERATE_60
# define DC1394_FRAMERATE_120 FRAMERATE_120
# define DC1394_FRAMERATE_240 FRAMERATE_240
# endif
# undef free
typedef struct dc1394_data {
AVClass * class ;
# if HAVE_LIBDC1394_1
raw1394handle_t handle ;
dc1394_cameracapture camera ;
int channel ;
# elif HAVE_LIBDC1394_2
dc1394_t * d ;
dc1394camera_t * camera ;
dc1394video_frame_t * frame ;
# endif
int current_frame ;
int frame_rate ; /**< frames per 1000 seconds (fps * 1000) */
char * video_size ; /**< String describing video size, set by a private option. */
@ -68,16 +49,21 @@ typedef struct dc1394_data {
AVPacket packet ;
} dc1394_data ;
struct dc1394_frame_format {
int width ;
int height ;
enum PixelFormat pix_fmt ;
int frame_size_id ;
} dc1394_frame_formats [ ] = {
{ 320 , 240 , PIX_FMT_UYVY422 , DC1394_VIDEO_MODE_320x240_YUV422 } ,
{ 640 , 480 , PIX_FMT_UYYVYY411 , DC1394_VIDEO_MODE_640x480_YUV411 } ,
{ 640 , 480 , PIX_FMT_UYVY422 , DC1394_VIDEO_MODE_640x480_YUV422 } ,
{ 0 , 0 , 0 , 0 } /* gotta be the last one */
/* The list of color codings that we support.
* We assume big endian for the dc1394 16 bit modes : libdc1394 never sets the
* flag little_endian in dc1394video_frame_t . */
struct dc1394_color_coding {
int pix_fmt ;
int score ;
uint32_t coding ;
} dc1394_color_codings [ ] = {
{ PIX_FMT_GRAY16BE , 1000 , DC1394_COLOR_CODING_MONO16 } ,
{ PIX_FMT_RGB48BE , 1100 , DC1394_COLOR_CODING_RGB16 } ,
{ PIX_FMT_GRAY8 , 1200 , DC1394_COLOR_CODING_MONO8 } ,
{ PIX_FMT_RGB24 , 1300 , DC1394_COLOR_CODING_RGB8 } ,
{ PIX_FMT_UYYVYY411 , 1400 , DC1394_COLOR_CODING_YUV411 } ,
{ PIX_FMT_UYVY422 , 1500 , DC1394_COLOR_CODING_YUV422 } ,
{ PIX_FMT_NONE , 0 , 0 } /* gotta be the last one */
} ;
struct dc1394_frame_rate {
@ -98,9 +84,6 @@ struct dc1394_frame_rate {
# define OFFSET(x) offsetof(dc1394_data, x)
# define DEC AV_OPT_FLAG_DECODING_PARAM
static const AVOption options [ ] = {
# if HAVE_LIBDC1394_1
{ " channel " , " " , offsetof ( dc1394_data , channel ) , FF_OPT_TYPE_INT , { . dbl = 0 } , 0 , INT_MAX , AV_OPT_FLAG_DECODING_PARAM } ,
# endif
{ " video_size " , " A string describing frame size, such as 640x480 or hd720. " , OFFSET ( video_size ) , FF_OPT_TYPE_STRING , { . str = " qvga " } , 0 , 0 , DEC } ,
{ " pixel_format " , " " , OFFSET ( pixel_format ) , FF_OPT_TYPE_STRING , { . str = " uyvy422 " } , 0 , 0 , DEC } ,
{ " framerate " , " " , OFFSET ( framerate ) , FF_OPT_TYPE_STRING , { . str = " ntsc " } , 0 , 0 , DEC } ,
@ -114,220 +97,183 @@ static const AVClass libdc1394_class = {
. version = LIBAVUTIL_VERSION_INT ,
} ;
static inline int dc1394_read_common ( AVFormatContext * c , AVFormatParameters * ap ,
struct dc1394_frame_format * * select_fmt , struct dc1394_frame_rate * * select_fps )
static int dc1394_read_header ( AVFormatContext * c , AVFormatParameters * ap )
{
dc1394_data * dc1394 = c - > priv_data ;
AVStream * vst ;
struct dc1394_frame_format * fmt ;
struct dc1394_frame_rate * fps ;
enum PixelFormat pix_fmt ;
int width , height ;
AVRational framerate ;
int ret = 0 ;
if ( ( pix_fmt = av_get_pix_fmt ( dc1394 - > pixel_format ) ) = = PIX_FMT_NONE ) {
av_log ( c , AV_LOG_ERROR , " No such pixel format: %s. \n " , dc1394 - > pixel_format ) ;
ret = AVERROR ( EINVAL ) ;
goto out ;
}
const struct dc1394_color_coding * cc ;
const struct dc1394_frame_rate * fr ;
dc1394camera_list_t * list ;
dc1394video_modes_t video_modes ;
dc1394video_mode_t video_mode ;
dc1394framerates_t frame_rates ;
dc1394framerate_t frame_rate ;
uint32_t dc1394_width , dc1394_height , dc1394_color_coding ;
int rate , best_rate ;
int score , max_score ;
int final_width , final_height , final_pix_fmt , final_frame_rate ;
int res , i , j ;
int ret = - 1 ;
if ( ( ret = av_parse_video_size ( & width , & height , dc1394 - > video_size ) ) < 0 ) {
av_log ( c , AV_LOG_ERROR , " Couldn't parse video size. \n " ) ;
/* Now let us prep the hardware. */
dc1394 - > d = dc1394_new ( ) ;
dc1394_camera_enumerate ( dc1394 - > d , & list ) ;
if ( ! list | | list - > num = = 0 ) {
av_log ( c , AV_LOG_ERROR , " Unable to look for an IIDC camera \n \n " ) ;
goto out ;
}
if ( ( ret = av_parse_video_rate ( & framerate , dc1394 - > framerate ) ) < 0 ) {
av_log ( c , AV_LOG_ERROR , " Couldn't parse framerate. \n " ) ;
goto out ;
/* FIXME: To select a specific camera I need to search in list its guid */
dc1394 - > camera = dc1394_camera_new ( dc1394 - > d , list - > ids [ 0 ] . guid ) ;
if ( list - > num > 1 ) {
av_log ( c , AV_LOG_INFO , " Working with the first camera found \n " ) ;
}
# 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 ;
if ( ap - > time_base . num )
framerate = ( AVRational ) { ap - > time_base . den , ap - > time_base . num } ;
# endif
dc1394 - > frame_rate = av_rescale ( 1000 , framerate . num , framerate . den ) ;
for ( fmt = dc1394_frame_formats ; fmt - > width ; fmt + + )
if ( fmt - > pix_fmt = = pix_fmt & & fmt - > width = = width & & fmt - > height = = height )
break ;
for ( fps = dc1394_frame_rates ; fps - > frame_rate ; fps + + )
if ( fps - > frame_rate = = dc1394 - > frame_rate )
break ;
/* Freeing list of cameras */
dc1394_camera_free_list ( list ) ;
if ( ! fps - > frame_rate | | ! fmt - > width ) {
av_log ( c , AV_LOG_ERROR , " Can't find matching camera format for %s, %dx%d@%d:1000fps \n " , av_get_pix_fmt_name ( pix_fmt ) ,
width , height , dc1394 - > frame_rate ) ;
ret = AVERROR ( EINVAL ) ;
goto out ;
/* Get the list of video modes supported by the camera. */
res = dc1394_video_get_supported_modes ( dc1394 - > camera , & video_modes ) ;
if ( res ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Could not get video formats. \n " ) ;
goto out_camera ;
}
/* create a video stream */
vst = av_new_stream ( c , 0 ) ;
if ( ! vst ) {
ret = AVERROR ( ENOMEM ) ;
if ( dc1394 - > pixel_format ) {
if ( ( ap - > pix_fmt = av_get_pix_fmt ( dc1394 - > pixel_format ) ) = = PIX_FMT_NONE ) {
av_log ( c , AV_LOG_ERROR , " No such pixel format: %s. \n " , dc1394 - > pixel_format ) ;
ret = AVERROR ( EINVAL ) ;
goto out ;
}
av_set_pts_info ( vst , 64 , 1 , 1000 ) ;
vst - > codec - > codec_type = AVMEDIA_TYPE_VIDEO ;
vst - > codec - > codec_id = CODEC_ID_RAWVIDEO ;
vst - > codec - > time_base . den = framerate . num ;
vst - > codec - > time_base . num = framerate . den ;
vst - > codec - > width = fmt - > width ;
vst - > codec - > height = fmt - > height ;
vst - > codec - > pix_fmt = fmt - > pix_fmt ;
/* packet init */
av_init_packet ( & dc1394 - > packet ) ;
dc1394 - > packet . size = avpicture_get_size ( fmt - > pix_fmt , fmt - > width , fmt - > height ) ;
dc1394 - > packet . stream_index = vst - > index ;
dc1394 - > packet . flags | = AV_PKT_FLAG_KEY ;
dc1394 - > current_frame = 0 ;
vst - > codec - > bit_rate = av_rescale ( dc1394 - > packet . size * 8 , fps - > frame_rate , 1000 ) ;
* select_fps = fps ;
* select_fmt = fmt ;
out :
av_freep ( & dc1394 - > video_size ) ;
av_freep ( & dc1394 - > pixel_format ) ;
av_freep ( & dc1394 - > framerate ) ;
return ret ;
}
# if HAVE_LIBDC1394_1
static int dc1394_v1_read_header ( AVFormatContext * c , AVFormatParameters * ap )
{
dc1394_data * dc1394 = c - > priv_data ;
AVStream * vst ;
nodeid_t * camera_nodes ;
int res ;
struct dc1394_frame_format * fmt = NULL ;
struct dc1394_frame_rate * fps = NULL ;
if ( dc1394_read_common ( c , ap , & fmt , & fps ) ! = 0 )
return - 1 ;
# if FF_API_FORMAT_PARAMETERS
if ( ap - > channel )
dc1394 - > channel = ap - > channel ;
# endif
/* Now let us prep the hardware. */
dc1394 - > handle = dc1394_create_handle ( 0 ) ; /* FIXME: gotta have ap->port */
if ( ! dc1394 - > handle ) {
av_log ( c , AV_LOG_ERROR , " Can't acquire dc1394 handle on port %d \n " , 0 /* ap->port */ ) ;
if ( dc1394 - > video_size ) {
if ( ( ret = av_parse_video_size ( & ap - > width , & ap - > height , dc1394 - > video_size ) ) < 0 ) {
av_log ( c , AV_LOG_ERROR , " Couldn't parse video size. \n " ) ;
goto out ;
}
camera_nodes = dc1394_get_camera_nodes ( dc1394 - > handle , & res , 1 ) ;
if ( ! camera_nodes | | camera_nodes [ dc1394 - > channel ] = = DC1394_NO_CAMERA ) {
av_log ( c , AV_LOG_ERROR , " There's no IIDC camera on the channel %d \n " , dc1394 - > channel ) ;
goto out_handle ;
}
res = dc1394_dma_setup_capture ( dc1394 - > handle , camera_nodes [ dc1394 - > channel ] ,
0 ,
FORMAT_VGA_NONCOMPRESSED ,
fmt - > frame_size_id ,
SPEED_400 ,
fps - > frame_rate_id , 8 , 1 ,
c - > filename ,
& dc1394 - > camera ) ;
dc1394_free_camera_nodes ( camera_nodes ) ;
if ( res ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Can't prepare camera for the DMA capture \n " ) ;
goto out_handle ;
}
res = dc1394_start_iso_transmission ( dc1394 - > handle , dc1394 - > camera . node ) ;
if ( res ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Can't start isochronous transmission \n " ) ;
goto out_handle_dma ;
/* Choose the best mode. */
rate = ( ap - > time_base . num ? av_rescale ( 1000 , ap - > time_base . den , ap - > time_base . num ) : - 1 ) ;
max_score = - 1 ;
for ( i = 0 ; i < video_modes . num ; i + + ) {
if ( video_modes . modes [ i ] = = DC1394_VIDEO_MODE_EXIF
| | ( video_modes . modes [ i ] > = DC1394_VIDEO_MODE_FORMAT7_MIN
& & video_modes . modes [ i ] < = DC1394_VIDEO_MODE_FORMAT7_MAX ) ) {
/* These modes are currently not supported as they would require
* much more work . For the remaining modes , the functions
* dc1394_get_image_size_from_video_mode and
* dc1394_get_color_coding_from_video_mode do not need to query the
* camera , and thus cannot fail . */
continue ;
}
return 0 ;
out_handle_dma :
dc1394_dma_unlisten ( dc1394 - > handle , & dc1394 - > camera ) ;
dc1394_dma_release_camera ( dc1394 - > handle , & dc1394 - > camera ) ;
out_handle :
dc1394_destroy_handle ( dc1394 - > handle ) ;
out :
return - 1 ;
dc1394_get_color_coding_from_video_mode ( NULL , video_modes . modes [ i ] ,
& dc1394_color_coding ) ;
for ( cc = dc1394_color_codings ; cc - > pix_fmt ! = PIX_FMT_NONE ; cc + + )
if ( cc - > coding = = dc1394_color_coding )
break ;
if ( cc - > pix_fmt = = PIX_FMT_NONE ) {
/* We currently cannot handle this color coding. */
continue ;
}
static int dc1394_v1_read_packet ( AVFormatContext * c , AVPacket * pkt )
{
struct dc1394_data * dc1394 = c - > priv_data ;
int res ;
/* discard stale frame */
if ( dc1394 - > current_frame + + ) {
if ( dc1394_dma_done_with_buffer ( & dc1394 - > camera ) ! = DC1394_SUCCESS )
av_log ( c , AV_LOG_ERROR , " failed to release %d frame \n " , dc1394 - > current_frame ) ;
/* Here we know that the mode is supported. Get its frame size and the list
* of frame rates supported by the camera for this mode . This list is sorted
* in ascending order according to libdc1394 example programs . */
dc1394_get_image_size_from_video_mode ( NULL , video_modes . modes [ i ] ,
& dc1394_width , & dc1394_height ) ;
res = dc1394_video_get_supported_framerates ( dc1394 - > camera , video_modes . modes [ i ] ,
& frame_rates ) ;
if ( res ! = DC1394_SUCCESS | | frame_rates . num = = 0 ) {
av_log ( c , AV_LOG_ERROR , " Cannot get frame rates for video mode. \n " ) ;
goto out_camera ;
}
res = dc1394_dma_single_capture ( & dc1394 - > camera ) ;
if ( res = = DC1394_SUCCESS ) {
dc1394 - > packet . data = ( uint8_t * ) ( dc1394 - > camera . capture_buffer ) ;
dc1394 - > packet . pts = ( dc1394 - > current_frame * 1000000 ) / dc1394 - > frame_rate ;
res = dc1394 - > packet . size ;
/* Choose the best frame rate. */
best_rate = - 1 ;
for ( j = 0 ; j < frame_rates . num ; j + + ) {
for ( fr = dc1394_frame_rates ; fr - > frame_rate ; fr + + ) {
if ( fr - > frame_rate_id = = frame_rates . framerates [ j ] ) {
break ;
}
}
if ( ! fr - > frame_rate ) {
/* This frame rate is not supported. */
continue ;
}
best_rate = fr - > frame_rate ;
frame_rate = fr - > frame_rate_id ;
if ( ap - > time_base . num & & rate = = fr - > frame_rate ) {
/* This is the requested frame rate. */
break ;
}
}
if ( best_rate = = - 1 ) {
/* No supported rate found. */
continue ;
}
/* Here we know that both the mode and the rate are supported. Compute score. */
if ( ap - > width & & ap - > height
& & ( dc1394_width = = ap - > width & & dc1394_height = = ap - > height ) ) {
score = 110000 ;
} else {
av_log ( c , AV_LOG_ERROR , " DMA capture failed \n " ) ;
dc1394 - > packet . data = NULL ;
res = - 1 ;
score = dc1394_width * 10 ; // 1600 - 16000
}
* pkt = dc1394 - > packet ;
return res ;
if ( ap - > pix_fmt = = cc - > pix_fmt ) {
score + = 90000 ;
} else {
score + = cc - > score ; // 1000 - 1500
}
static int dc1394_v1_close ( AVFormatContext * context )
{
struct dc1394_data * dc1394 = context - > priv_data ;
dc1394_stop_iso_transmission ( dc1394 - > handle , dc1394 - > camera . node ) ;
dc1394_dma_unlisten ( dc1394 - > handle , & dc1394 - > camera ) ;
dc1394_dma_release_camera ( dc1394 - > handle , & dc1394 - > camera ) ;
dc1394_destroy_handle ( dc1394 - > handle ) ;
return 0 ;
if ( ap - > time_base . num & & rate = = best_rate ) {
score + = 70000 ;
} else {
score + = best_rate / 1000 ; // 1 - 240
}
if ( score > max_score ) {
video_mode = video_modes . modes [ i ] ;
final_width = dc1394_width ;
final_height = dc1394_height ;
final_pix_fmt = cc - > pix_fmt ;
final_frame_rate = best_rate ;
max_score = score ;
}
}
if ( max_score = = - 1 ) {
av_log ( c , AV_LOG_ERROR , " No suitable video mode / frame rate available. \n " ) ;
goto out_camera ;
}
if ( ap - > width & & ap - > height & & ! ( ap - > width = = final_width & & ap - > height = = final_height ) ) {
av_log ( c , AV_LOG_WARNING , " Requested frame size is not available, using fallback. \n " ) ;
}
if ( ap - > pix_fmt ! = PIX_FMT_NONE & & ap - > pix_fmt ! = final_pix_fmt ) {
av_log ( c , AV_LOG_WARNING , " Requested pixel format is not supported, using fallback. \n " ) ;
}
if ( ap - > time_base . num & & rate ! = final_frame_rate ) {
av_log ( c , AV_LOG_WARNING , " Requested frame rate is not available, using fallback. \n " ) ;
}
# elif HAVE_LIBDC1394_2
static int dc1394_v2_read_header ( AVFormatContext * c , AVFormatParameters * ap )
{
dc1394_data * dc1394 = c - > priv_data ;
dc1394camera_list_t * list ;
int res , i ;
struct dc1394_frame_format * fmt = NULL ;
struct dc1394_frame_rate * fps = NULL ;
if ( dc1394_read_common ( c , ap , & fmt , & fps ) ! = 0 )
return - 1 ;
/* create a video stream */
vst = av_new_stream ( c , 0 ) ;
if ( ! vst )
goto out_camera ;
av_set_pts_info ( vst , 64 , 1 , 1000 ) ;
vst - > codec - > codec_type = AVMEDIA_TYPE_VIDEO ;
vst - > codec - > codec_id = CODEC_ID_RAWVIDEO ;
vst - > codec - > time_base . den = final_frame_rate ;
vst - > codec - > time_base . num = 1000 ;
vst - > codec - > width = final_width ;
vst - > codec - > height = final_height ;
vst - > codec - > pix_fmt = final_pix_fmt ;
/* Now let us prep the hardware. */
dc1394 - > d = dc1394_new ( ) ;
dc1394_camera_enumerate ( dc1394 - > d , & list ) ;
if ( ! list | | list - > num = = 0 ) {
av_log ( c , AV_LOG_ERROR , " Unable to look for an IIDC camera \n \n " ) ;
goto out ;
}
/* packet init */
av_init_packet ( & dc1394 - > packet ) ;
dc1394 - > packet . size = avpicture_get_size ( final_pix_fmt , final_width , final_height ) ;
dc1394 - > packet . stream_index = vst - > index ;
dc1394 - > packet . flags | = AV_PKT_FLAG_KEY ;
/* FIXME: To select a specific camera I need to search in list its guid */
dc1394 - > camera = dc1394_camera_new ( dc1394 - > d , list - > ids [ 0 ] . guid ) ;
if ( list - > num > 1 ) {
av_log ( c , AV_LOG_INFO , " Working with the first camera found \n " ) ;
}
dc1394 - > current_frame = 0 ;
dc1394 - > frame_rate = final_frame_rate ;
/* Freeing list of cameras */
dc1394_camera_free_list ( list ) ;
vst - > codec - > bit_rate = av_rescale ( dc1394 - > packet . size * 8 , final_frame_rate , 1000 ) ;
/* Select MAX Speed possible from the cam */
if ( dc1394 - > camera - > bmode_capable > 0 ) {
@ -345,13 +291,13 @@ static int dc1394_v2_read_header(AVFormatContext *c, AVFormatParameters * ap)
goto out_camera ;
}
if ( dc1394_video_set_mode ( dc1394 - > camera , fmt - > frame_size_id ) ! = DC1394_SUCCESS ) {
if ( dc1394_video_set_mode ( dc1394 - > camera , video_mode ) ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Couldn't set video format \n " ) ;
goto out_camera ;
}
if ( dc1394_video_set_framerate ( dc1394 - > camera , fps - > frame_rate_id ) ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Couldn't set framerate %d \n " , fps - > frame_rate ) ;
if ( dc1394_video_set_framerate ( dc1394 - > camera , frame_rate ) ! = DC1394_SUCCESS ) {
av_log ( c , AV_LOG_ERROR , " Could not set framerate %d. \n " , final_ frame_rate ) ;
goto out_camera ;
}
if ( dc1394_capture_setup ( dc1394 - > camera , 10 , DC1394_CAPTURE_FLAGS_DEFAULT ) ! = DC1394_SUCCESS ) {
@ -370,11 +316,13 @@ out_camera:
dc1394_video_set_transmission ( dc1394 - > camera , DC1394_OFF ) ;
dc1394_camera_free ( dc1394 - > camera ) ;
out :
av_freep ( & dc1394 - > video_size ) ;
av_freep ( & dc1394 - > pixel_format ) ;
dc1394_free ( dc1394 - > d ) ;
return - 1 ;
return ret ;
}
static int dc1394_v2_ read_packet ( AVFormatContext * c , AVPacket * pkt )
static int dc1394_read_packet ( AVFormatContext * c , AVPacket * pkt )
{
struct dc1394_data * dc1394 = c - > priv_data ;
int res ;
@ -400,7 +348,7 @@ static int dc1394_v2_read_packet(AVFormatContext *c, AVPacket *pkt)
return res ;
}
static int dc1394_v2_ close ( AVFormatContext * context )
static int dc1394_close ( AVFormatContext * context )
{
struct dc1394_data * dc1394 = context - > priv_data ;
@ -414,25 +362,11 @@ static int dc1394_v2_close(AVFormatContext * context)
AVInputFormat ff_libdc1394_demuxer = {
. name = " libdc1394 " ,
. long_name = NULL_IF_CONFIG_SMALL ( " dc1394 v.2 A/V grab " ) ,
. priv_data_size = sizeof ( struct dc1394_data ) ,
. read_header = dc1394_v2_read_header ,
. read_packet = dc1394_v2_read_packet ,
. read_close = dc1394_v2_close ,
. flags = AVFMT_NOFILE ,
. priv_class = & libdc1394_class ,
} ;
# endif
# if HAVE_LIBDC1394_1
AVInputFormat ff_libdc1394_demuxer = {
. name = " libdc1394 " ,
. long_name = NULL_IF_CONFIG_SMALL ( " dc1394 v.1 A/V grab " ) ,
. long_name = NULL_IF_CONFIG_SMALL ( " dc1394 A/V grab " ) ,
. priv_data_size = sizeof ( struct dc1394_data ) ,
. read_header = dc1394_v1_ read_header ,
. read_packet = dc1394_v1_ read_packet ,
. read_close = dc1394_v1_ close ,
. read_header = dc1394_read_header ,
. read_packet = dc1394_read_packet ,
. read_close = dc1394_close ,
. flags = AVFMT_NOFILE ,
. priv_class = & libdc1394_class ,
} ;
# endif