Skip to content

Commit

Permalink
avformat: add url field to AVFormatContext
Browse files Browse the repository at this point in the history
This will replace the 1024 character limited filename field. Compatiblity for
output contexts are provided by copying filename field to URL if URL is unset
and by providing an internal function for muxers to set both url and filename
at once.

Signed-off-by: Marton Balint <cus@passwd.hu>
  • Loading branch information
cus committed Jan 28, 2018
1 parent dc5d151 commit ea3672b
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 2 deletions.
3 changes: 3 additions & 0 deletions doc/APIchanges
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ libavutil: 2017-10-21

API changes, most recent first:

2018-01-xx - xxxxxxx - lavf 58.7.100 - avformat.h
Add url field to AVFormatContext and add ff_format_set_url helper function.

2018-01-xx - xxxxxxx - lavf 58.6.100 - avformat.h
Add AVFMTCTX_UNSEEKABLE (for HLS demuxer).

Expand Down
15 changes: 15 additions & 0 deletions libavformat/avformat.h
Original file line number Diff line number Diff line change
Expand Up @@ -1402,6 +1402,21 @@ typedef struct AVFormatContext {
*/
char filename[1024];

/**
* input or output URL. Unlike the old filename field, this field has no
* length restriction.
*
* - demuxing: set by avformat_open_input(), initialized to an empty
* string if url parameter was NULL in avformat_open_input().
* - muxing: may be set by the caller before calling avformat_write_header()
* (or avformat_init_output() if that is called first) to a string
* which is freeable by av_free(). Set to an empty string if it
* was NULL in avformat_init_output().
*
* Freed by libavformat in avformat_free_context().
*/
char *url;

/**
* Position of the first frame of the component, in
* AV_TIME_BASE fractional seconds. NEVER set this value directly:
Expand Down
7 changes: 7 additions & 0 deletions libavformat/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -696,4 +696,11 @@ int ff_interleaved_peek(AVFormatContext *s, int stream,
int ff_lock_avformat(void);
int ff_unlock_avformat(void);

/**
* Set AVFormatContext url field to the provided pointer. The pointer must
* point to a valid string. The existing url field is freed if necessary. Also
* set the legacy filename field to the same string which was provided in url.
*/
void ff_format_set_url(AVFormatContext *s, char *url);

#endif /* AVFORMAT_INTERNAL_H */
11 changes: 10 additions & 1 deletion libavformat/mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,12 @@ int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *ofor
} else
s->priv_data = NULL;

if (filename)
if (filename) {
av_strlcpy(s->filename, filename, sizeof(s->filename));
if (!(s->url = av_strdup(filename)))
goto nomem;

}
*avctx = s;
return 0;
nomem:
Expand Down Expand Up @@ -251,6 +255,11 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options)
(ret = av_opt_set_dict2(s->priv_data, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
goto fail;

if (!s->url && !(s->url = av_strdup(s->filename))) {
ret = AVERROR(ENOMEM);
goto fail;
}

#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGS
if (s->nb_streams && s->streams[0]->codec->flags & AV_CODEC_FLAG_BITEXACT) {
Expand Down
14 changes: 14 additions & 0 deletions libavformat/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,11 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
if ((ret = av_opt_set_dict(s, &tmp)) < 0)
goto fail;

if (!(s->url = av_strdup(filename ? filename : ""))) {
ret = AVERROR(ENOMEM);
goto fail;
}

av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
if ((ret = init_input(s, filename, &tmp)) < 0)
goto fail;
Expand Down Expand Up @@ -4371,6 +4376,7 @@ void avformat_free_context(AVFormatContext *s)
av_freep(&s->streams);
flush_packet_queue(s);
av_freep(&s->internal);
av_freep(&s->url);
av_free(s);
}

Expand Down Expand Up @@ -5636,3 +5642,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
return st->internal->avctx->time_base;
#endif
}

void ff_format_set_url(AVFormatContext *s, char *url)
{
av_assert0(url);
av_freep(&s->url);
s->url = url;
av_strlcpy(s->filename, url, sizeof(s->filename));
}
2 changes: 1 addition & 1 deletion libavformat/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
// Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58
#define LIBAVFORMAT_VERSION_MINOR 6
#define LIBAVFORMAT_VERSION_MINOR 7
#define LIBAVFORMAT_VERSION_MICRO 100

#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
Expand Down

0 comments on commit ea3672b

Please sign in to comment.