30 #define CONTROL_BUFFER_SIZE 1024
31 #define DIR_BUFFER_SIZE 4096
74 #define OFFSET(x) offsetof(FTPContext, x)
75 #define D AV_OPT_FLAG_DECODING_PARAM
76 #define E AV_OPT_FLAG_ENCODING_PARAM
78 {
"timeout",
"set timeout of socket I/O operations",
OFFSET(rw_timeout),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
D|
E },
79 {
"ftp-write-seekable",
"control seekability of connection during encoding",
OFFSET(write_seekable),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
E },
80 {
"ftp-anonymous-password",
"password for anonymous login. E-mail address should be used.",
OFFSET(anonymous_password),
AV_OPT_TYPE_STRING, { 0 }, 0, 0,
D|
E },
122 if (q > line && q[-1] ==
'\r')
127 if ((q - line) < line_size - 1)
140 int err, i, dash = 0, result = 0, code_found = 0, linesize;
142 AVBPrint line_buffer;
147 while (!code_found || dash) {
156 linesize = strlen(buf);
159 for (i = 0; i < 3; ++i) {
160 if (buf[i] <
'0' || buf[i] >
'9') {
174 for (i = 0; response_codes[i]; ++i) {
175 if (err == response_codes[i]) {
186 if (!dash && buf[3] ==
'-')
188 else if (err == dash && buf[3] ==
' ')
200 const int response_codes[],
char **response)
218 if (response_codes) {
219 return ftp_status(s, response, response_codes);
241 static const int user_codes[] = {331, 230, 0};
242 static const int pass_codes[] = {230, 0};
263 static const char d =
'|';
264 static const char *
command =
"EPSV\r\n";
265 static const int epsv_codes[] = {229, 0};
270 for (i = 0; res[i]; ++i) {
273 }
else if (res[i] ==
')') {
282 if (strlen(start) < 5)
284 if (start[0] != d || start[1] != d || start[2] != d || end[-1] != d)
305 static const char *
command =
"PASV\r\n";
306 static const int pasv_codes[] = {227, 0};
311 for (i = 0; res[i]; ++i) {
314 }
else if (res[i] ==
')') {
331 if (!start)
goto fail;
334 if (!start)
goto fail;
351 static const char *
command =
"PWD\r\n";
352 static const int pwd_codes[] = {257, 0};
357 for (i = 0; res[i]; ++i) {
389 static const int size_codes[] = {213, 0};
391 snprintf(command,
sizeof(command),
"SIZE %s\r\n", s->
path);
407 static const int retr_codes[] = {150, 125, 0};
410 snprintf(command,
sizeof(command),
"RETR %s\r\n", s->
path);
412 if (resp_code != 125 && resp_code != 150)
423 static const int stor_codes[] = {150, 125, 0};
426 snprintf(command,
sizeof(command),
"STOR %s\r\n", s->
path);
428 if (resp_code != 125 && resp_code != 150)
438 static const char *
command =
"TYPE I\r\n";
439 static const int type_codes[] = {200, 0};
450 static const int rest_codes[] = {350, 0};
452 snprintf(command,
sizeof(command),
"REST %"PRId64
"\r\n", pos);
461 static const int cwd_codes[] = {250, 550, 0};
464 snprintf(command,
sizeof(command),
"CWD %s\r\n", s->
path);
472 static const char *
command =
"MLSD\r\n";
473 static const int mlsd_codes[] = {150, 500, 0};
483 static const char *
command =
"NLST\r\n";
484 static const int nlst_codes[] = {226, 425, 426, 451, 450, 550, 0};
515 static const char *feat_command =
"FEAT\r\n";
516 static const char *enable_utf8_command =
"OPTS UTF8 ON\r\n";
517 static const int feat_codes[] = {211, 0};
518 static const int opts_codes[] = {200, 451, 0};
539 static const int connect_codes[] = {220, 0};
563 av_log(h,
AV_LOG_WARNING,
"Pure-FTPd server is used as an output protocol. It is known issue this implementation may produce incorrect content and it cannot be fixed at this moment.");
618 static const char *
command =
"ABOR\r\n";
620 static const int abor_codes[] = {225, 226, 0};
657 const char *tok_user =
NULL, *tok_pass =
NULL;
669 credencials,
sizeof(credencials),
670 hostname,
sizeof(hostname),
675 tok_user =
av_strtok(credencials,
":", &end);
678 tok_user =
"anonymous";
711 ff_dlog(h,
"ftp protocol open\n");
737 int64_t new_pos, fake_pos;
739 ff_dlog(h,
"ftp protocol seek %"PRId64
" %d\n", pos, whence);
779 int read, err, retry_done = 0;
781 ff_dlog(h,
"ftp protocol read %d bytes\n", size);
811 if (read <= 0 && s->position < s->filesize && !h->
is_streamed) {
817 if ((err =
ftp_seek(h, pos, SEEK_SET)) < 0) {
839 ff_dlog(h,
"ftp protocol write %d bytes\n", size);
866 ff_dlog(h,
"ftp protocol close\n");
882 ff_dlog(h,
"ftp protocol get_file_handle\n");
894 ff_dlog(h,
"ftp protocol shutdown\n");
932 memset(&tv, 0,
sizeof(
struct tm));
934 return INT64_C(1000000) *
av_timegm(&tv);
947 while(fact =
av_strtok(mlsd,
";", &mlsd)) {
948 if (fact[0] ==
' ') {
971 next->
size = strtoll(value,
NULL, 10);
1003 while (!(found = strstr(start,
"\n"))) {
1024 if (found > start && found[-1] ==
'\r')
1030 (*next)->utf8 = s->
utf8;
1054 static const int del_codes[] = {250, 421, 450, 500, 501, 502, 530, 550, 0};
1055 static const int rmd_codes[] = {250, 421, 500, 501, 502, 530, 550, 0};
1061 snprintf(command,
sizeof(command),
"DELE %s\r\n", s->
path);
1067 snprintf(command,
sizeof(command),
"RMD %s\r\n", s->
path);
1082 static const int rnfr_codes[] = {350, 421, 450, 500, 501, 502, 503, 530, 0};
1083 static const int rnto_codes[] = {250, 421, 500, 501, 502, 503, 530, 532, 553, 0};
1089 snprintf(command,
sizeof(command),
"RNFR %s\r\n", s->
path);
1098 snprintf(command,
sizeof(command),
"RNTO %s\r\n", path);
1119 .priv_data_class = &ftp_context_class,
1126 .default_whitelist =
"tcp",
time_t av_timegm(struct tm *tm)
Convert the decomposed UTC time in tm to a time_t value.
const URLProtocol ff_ftp_protocol
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it. ...
#define URL_PROTOCOL_FLAG_NETWORK
static int ftp_get_line(FTPContext *s, char *line, int line_size)
char * password
Server user's password.
int64_t filemode
Unix file mode, -1 if unknown.
#define AV_LOG_WARNING
Something somehow does not look correct.
static int ftp_list(FTPContext *s)
static int ftp_move(URLContext *h_src, URLContext *h_dst)
#define LIBAVUTIL_VERSION_INT
static int ftp_file_size(FTPContext *s)
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle...
int is_streamed
true if streamed (no seek possible), default = false
AVIOInterruptCB interrupt_callback
Describes single entry of the directory.
#define AVIO_FLAG_READ
read-only
static int ftp_connect(URLContext *h, const char *url)
#define AVIO_FLAG_WRITE
write-only
static int ftp_open(URLContext *h, const char *url, int flags)
uint8_t * control_buf_end
static int ftp_status(FTPContext *s, char **line, const int response_codes[])
int write_seekable
Control seekability, 0 = disable, 1 = enable.
static int ftp_retrieve(FTPContext *s)
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
int ffurl_shutdown(URLContext *h, int flags)
Signal the URLContext that we are done reading or writing the stream.
int64_t modification_timestamp
Time of last modification in microseconds since unix epoch, -1 if unknown.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
URLContext * conn_control
Control connection.
static int ftp_read_dir(URLContext *h, AVIODirEntry **next)
static int ftp_connect_data_connection(URLContext *h)
static int ftp_set_dir(FTPContext *s)
static int ftp_shutdown(URLContext *h, int flags)
static av_cold int end(AVCodecContext *avctx)
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(constuint8_t *) pi-0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(constint16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(constint32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(constint64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64,*(constint64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64,*(constint64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(constfloat *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(constdouble *) pi *(INT64_C(1)<< 63)))#defineFMT_PAIR_FUNC(out, in) staticconv_func_type *constfmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64),};staticvoidcpy1(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, len);}staticvoidcpy2(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 2 *len);}staticvoidcpy4(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 4 *len);}staticvoidcpy8(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 8 *len);}AudioConvert *swri_audio_convert_alloc(enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, constint *ch_map, intflags){AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) returnNULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) returnNULL;if(channels==1){in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);}ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map){switch(av_get_bytes_per_sample(in_fmt)){case1:ctx->simd_f=cpy1;break;case2:ctx->simd_f=cpy2;break;case4:ctx->simd_f=cpy4;break;case8:ctx->simd_f=cpy8;break;}}if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);returnctx;}voidswri_audio_convert_free(AudioConvert **ctx){av_freep(ctx);}intswri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, intlen){intch;intoff=0;constintos=(out->planar?1:out->ch_count)*out->bps;unsignedmisaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask){intplanes=in->planar?in->ch_count:1;unsignedm=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;}if(ctx->out_simd_align_mask){intplanes=out->planar?out->ch_count:1;unsignedm=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;}if(ctx->simd_f &&!ctx->ch_map &&!misaligned){off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){if(out->planar==in->planar){intplanes=out->planar?out->ch_count:1;for(ch=0;ch< planes;ch++){ctx->simd_f(out-> ch ch
int64_t filesize
Size of file on server, -1 on error.
char * av_small_strptime(const char *p, const char *fmt, struct tm *dt)
Simplified version of strptime.
static int ftp_delete(URLContext *h)
static int ftp_connect_control_connection(URLContext *h)
uint8_t control_buffer[CONTROL_BUFFER_SIZE]
Control connection buffer.
static int ftp_current_dir(FTPContext *s)
uint8_t * control_buf_ptr
static int ftp_passive_mode(FTPContext *s)
int server_data_port
Data connection port opened by server, -1 on error.
FTPListingMethod listing_method
Called listing method.
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
static int ftp_getc(FTPContext *s)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * anonymous_password
Password to be used for anonymous user.
const char * protocol_whitelist
static int ftp_abort(URLContext *h)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
static int ftp_send_command(FTPContext *s, const char *command, const int response_codes[], char **response)
static void ftp_close_both_connections(FTPContext *s)
static int ftp_passive_mode_epsv(FTPContext *s)
void avio_free_directory_entry(AVIODirEntry **entry)
Free entry allocated by avio_read_dir().
int rw_timeout
Network timeout.
common internal API header
static int ftp_parse_entry_nlst(char *line, AVIODirEntry *next)
static int ftp_read(URLContext *h, unsigned char *buf, int size)
static int ftp_close(URLContext *h)
URLContext * conn_data
Data connection, NULL when not connected.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
GLsizei GLboolean const GLfloat * value
static int ftp_auth(FTPContext *s)
int64_t position
Current position, calculated.
static int ftp_restart(FTPContext *s, int64_t pos)
char * features
List of server's features represented as raw response.
static int ftp_has_feature(FTPContext *s, const char *feature_name)
char * path
Path to resource on server.
int ffurl_get_file_handle(URLContext *h)
Return the file descriptor associated with this URL.
int64_t size
File size in bytes, -1 if unknown.
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
static int64_t ftp_seek(URLContext *h, int64_t pos, int whence)
#define AV_LOG_INFO
Standard information.
#define AV_BPRINT_SIZE_AUTOMATIC
char * av_strdup(const char *s)
Duplicate a string.
const char * protocol_blacklist
static int ftp_close_dir(URLContext *h)
int type
Type of the entry.
static int ftp_get_file_handle(URLContext *h)
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
static const AVOption options[]
#define AVIO_FLAG_READ_WRITE
read-write pseudo flag
FTPState state
State of data connection.
Describe the class of an AVClass context structure.
int64_t group_id
Group ID of owner, -1 if unknown.
static void ftp_close_data_connection(FTPContext *s)
static int ftp_features(FTPContext *s)
static int ftp_parse_entry_mlsd(char *mlsd, AVIODirEntry *next)
#define CONTROL_BUFFER_SIZE
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
static int ftp_write(URLContext *h, const unsigned char *buf, int size)
char * av_append_path_component(const char *path, const char *component)
Append path component to the existing path.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it...
AVIODirEntry * ff_alloc_dir_entry(void)
Allocate directory entry with default values.
char * filename
specified URL
#define AVSEEK_SIZE
ORing this as the "whence" parameter to a seek function causes it to return the filesize without seek...
char * hostname
Server address.
static int ftp_store(FTPContext *s)
static int ftp_type(FTPContext *s)
static int ftp_open_dir(URLContext *h)
int server_control_port
Control connection port, default is 21.
int64_t user_id
User ID of owner, -1 if unknown.
static int ftp_list_mlsd(FTPContext *s)
static const AVClass ftp_context_class
unbuffered private I/O API
static int64_t ftp_parse_date(const char *date)
static int ftp_parse_entry(URLContext *h, char *line, AVIODirEntry *next)
int ffurl_read(URLContext *h, unsigned char *buf, int size)
Read up to size bytes from the resource accessed by h, and store the read bytes in buf...
static av_cold void cleanup(FlashSV2Context *s)
static int ftp_list_nlst(FTPContext *s)