39 const char *authorization,
const char *hostname,
40 int port,
const char *fmt, ...)
49 if (authorization && authorization[0])
51 #if CONFIG_NETWORK && defined(AF_INET6)
56 if (ai->ai_family == AF_INET6) {
82 static const char *
find_delim(
const char *delim,
const char *cur,
const char *end)
84 while (cur < end && !strchr(delim, *cur))
91 const char *cur, *aend, *p;
95 end = url + strlen(url);
106 if (end - cur >= 2 && cur[0] ==
'/' && cur[1] ==
'/') {
122 if (p + 1 < aend && p[1] !=
':')
154 if ((path[0] >=
'a' && path[0] <=
'z' || path[0] >=
'A' && path[0] <=
'Z') &&
156 (path[2] ==
'/' || path[2] ==
'\\'))
158 if ((path[0] ==
'/' || path[0] ==
'\\') &&
159 (path[1] ==
'/' || path[1] ==
'\\'))
165 const char *
in,
const char *in_end)
168 const char *d, *next;
170 if (
in < in_end && *
in ==
'/')
172 while (
in < in_end) {
174 next = d + (d < in_end && *d ==
'/');
175 if (d -
in == 1 &&
in[0] ==
'.') {
177 }
else if (d -
in == 2 &&
in[0] ==
'.' &&
in[1] ==
'.') {
180 while (
out > root && (--
out)[-1] !=
'/');
182 if (out_end -
out < next -
in)
194 const char *rel,
int handle_dos_paths)
197 char *
out, *out_end, *path;
198 const char *keep, *base_path_end;
199 int use_base_path, simplify_path = 0, ret;
200 const char *base_separators =
"/";
223 out_end = buf +
size - 1;
227 if (handle_dos_paths) {
231 base_separators =
"/\\";
241 #define KEEP(component, also) do { \
242 if (uc.url_component_end_##component == uc.url && \
243 ub.url_component_end_##component > keep) { \
244 keep = ub.url_component_end_##component; \
249 KEEP(authority_full, simplify_path = 1;);
254 #define COPY(start, end) do { \
255 size_t len = end - start; \
256 if (len > out_end - out) { \
257 ret = AVERROR(ENOMEM); \
260 memmove(out, start, len); \
272 base_path_end =
ub.url_component_end_path;
274 while (base_path_end >
ub.path && !strchr(base_separators, base_path_end[-1]))
288 const char *root =
"/";
289 COPY(root, root + 1);
303 COPY(
ub.path, base_path_end);
304 COPY(uc.
path, uc.url_component_end_path);
307 COPY(uc.url_component_end_path, uc.
end);
314 ret ==
AVERROR(ENOMEM) ?
"truncated" :
315 ret ==
AVERROR(EINVAL) ?
"syntax_error" :
"");
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
common internal API header
Describes single entry of the directory.
int64_t user_id
User ID of owner, -1 if unknown.
int type
Type of the entry.
int64_t access_timestamp
Time of last access in microseconds since unix epoch, -1 if unknown.
int64_t status_change_timestamp
Time of last status change in microseconds since unix epoch, -1 if unknown.
int64_t size
File size in bytes, -1 if unknown.
int64_t group_id
Group ID of owner, -1 if unknown.
int64_t modification_timestamp
Time of last modification in microseconds since unix epoch, -1 if unknown.
int64_t filemode
Unix file mode, -1 if unknown.
const char * scheme
possibly including lavf-specific options
const char * port
including initial ':' if present
const char * authority
"//" if it is a real URL
const char * fragment
including initial '#' if present
const char * userinfo
including final '@' if present
const char * query
including initial '?' if present
const char * url
whole URL, for reference
static void error(const char *err)
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.
static int is_fq_dos_path(const char *path)
static int append_path(char *root, char *out_end, char **rout, const char *in, const char *in_end)
AVIODirEntry * ff_alloc_dir_entry(void)
Allocate directory entry with default values.
int ff_make_absolute_url2(char *buf, int size, const char *base, const char *rel, int handle_dos_paths)
Convert a relative url into an absolute url, given a base url.
static const char * find_delim(const char *delim, const char *cur, const char *end)
int ff_make_absolute_url(char *buf, int size, const char *base, const char *rel)
Convert a relative url into an absolute url, given a base url.
#define KEEP(component, also)
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
unbuffered private I/O API
#define URL_COMPONENT_HAVE(uc, component)