1 /*****************************************************************************
2 * mtp.c: mtp input (mtp: access plug-in)
3 *****************************************************************************
4 * Copyright (C) 2001-2006 VLC authors and VideoLAN
5 * Copyright © 2006-2008 Rémi Denis-Courmont
7 * Authors: Fabio Ritrovato <exsephiroth87@gmail.com>
8 * Original file.c: Christophe Massiot <massiot@via.ecp.fr>
9 * Rémi Denis-Courmont <rem # videolan # org>
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation; either version 2.1 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public License
22 * along with this program; if not, write to the Free Software Foundation,
23 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24 *****************************************************************************/
26 /*****************************************************************************
28 *****************************************************************************/
35 #include <sys/types.h>
40 #include <vlc_common.h>
41 #include <vlc_plugin.h>
42 #include <vlc_input.h>
43 #include <vlc_access.h>
44 #include <vlc_dialog.h>
49 /*****************************************************************************
51 *****************************************************************************/
53 static int Open ( vlc_object_t
* );
54 static void Close( vlc_object_t
* );
57 set_description( N_("MTP input") )
58 set_shortname( N_("MTP") )
59 set_category( CAT_INPUT
)
60 set_subcategory( SUBCAT_INPUT_ACCESS
)
61 set_capability( "access", 0 )
63 set_callbacks( Open
, Close
)
66 /*****************************************************************************
68 *****************************************************************************/
70 static int Seek( stream_t
*, uint64_t );
71 static ssize_t
Read( stream_t
*, void *, size_t );
72 static int Control( stream_t
*, int, va_list );
74 /*****************************************************************************
76 *****************************************************************************/
77 static int Open( vlc_object_t
*p_this
)
79 stream_t
*p_access
= ( stream_t
* )p_this
;
82 uint16_t i_product_id
;
84 LIBMTP_raw_device_t
*p_rawdevices
;
87 if( sscanf( p_access
->psz_location
, "%"SCNu32
":%"SCNu8
":%"SCNu16
":%d",
88 &i_bus
, &i_dev
, &i_product_id
, &i_track_id
) != 4 )
91 if( LIBMTP_Detect_Raw_Devices( &p_rawdevices
, &i_numrawdevices
) )
96 for( int i
= 0; i
< i_numrawdevices
; i
++ )
98 if( i_bus
== p_rawdevices
[i
].bus_location
&&
99 i_dev
== p_rawdevices
[i
].devnum
&&
100 i_product_id
== p_rawdevices
[i
].device_entry
.product_id
)
102 LIBMTP_mtpdevice_t
*p_device
;
104 p_device
= LIBMTP_Open_Raw_Device( &p_rawdevices
[i
] );
105 if( p_device
== NULL
)
109 if( unlikely(fd
== -1) )
112 msg_Dbg( p_access
, "copying to memory" );
113 LIBMTP_Get_File_To_File_Descriptor( p_device
, i_track_id
, fd
,
115 LIBMTP_Release_Device( p_device
);
119 free( p_rawdevices
);
123 msg_Err( p_access
, "cannot find %s", p_access
->psz_location
);
127 if( lseek( fd
, 0, SEEK_SET
) ) /* Reset file descriptor offset */
133 p_access
->p_sys
= (void *)(intptr_t)fd
;
134 ACCESS_SET_CALLBACKS( Read
, NULL
, Control
, Seek
);
138 /*****************************************************************************
139 * Close: close the target
140 *****************************************************************************/
141 static void Close( vlc_object_t
* p_this
)
143 stream_t
*p_access
= ( stream_t
* )p_this
;
144 int fd
= (intptr_t)p_access
->p_sys
;
149 /*****************************************************************************
150 * Read: standard read on a file descriptor.
151 *****************************************************************************/
152 static ssize_t
Read( stream_t
*p_access
, void *p_buffer
, size_t i_len
)
154 int fd
= (intptr_t)p_access
->p_sys
;
155 ssize_t i_ret
= read( fd
, p_buffer
, i_len
);
166 msg_Err( p_access
, "read failed: %s", vlc_strerror_c(errno
) );
167 vlc_dialog_display_error( p_access
, _( "File reading failed" ),
168 _( "VLC could not read the file: %s" ),
169 vlc_strerror(errno
) );
178 /*****************************************************************************
179 * Seek: seek to a specific location in a file
180 *****************************************************************************/
181 static int Seek( stream_t
*p_access
, uint64_t i_pos
)
183 int fd
= (intptr_t)p_access
->p_sys
;
185 if (lseek( fd
, i_pos
, SEEK_SET
) == (off_t
)-1)
190 /*****************************************************************************
192 *****************************************************************************/
193 static int Control( stream_t
*p_access
, int i_query
, va_list args
)
195 int fd
= (intptr_t)p_access
->p_sys
;
201 case STREAM_CAN_SEEK
:
202 case STREAM_CAN_FASTSEEK
:
203 pb_bool
= va_arg( args
, bool * );
207 case STREAM_CAN_PAUSE
:
208 case STREAM_CAN_CONTROL_PACE
:
209 pb_bool
= va_arg( args
, bool * );
213 case STREAM_GET_SIZE
:
215 uint64_t *s
= va_arg( args
, uint64_t * );
217 if( fstat( fd
, &st
) )
219 msg_Err( p_access
, "fstat error: %s", vlc_strerror_c(errno
) );
226 case STREAM_GET_PTS_DELAY
:
227 pi_64
= va_arg( args
, int64_t * );
228 *pi_64
= INT64_C(1000)
229 * var_InheritInteger( p_access
, "file-caching" );
232 case STREAM_SET_PAUSE_STATE
: