Go to the documentation of this file.
31 fprintf(stderr,
"%s -out foo.mpd file1\n", argv0);
88 while (!
f->eof_reached) {
120 int err = 0,
i, orig_tracks = tracks->
nb_tracks;
121 char errbuf[50], *ptr;
127 fprintf(stderr,
"Unable to open %s: %s\n",
file, errbuf);
134 fprintf(stderr,
"Unable to identify %s: %s\n",
file, errbuf);
139 fprintf(stderr,
"No streams found in %s\n",
file);
150 fprintf(stderr,
"Skipping track %d in %s as it has zero bitrate\n",
171 if ((ptr = strrchr(
file,
'/')))
172 track->
name = ptr + 1;
183 "Track %d in %s is neither video nor audio, skipping\n",
220 int minutes = seconds / 60;
221 int hours = minutes / 60;
228 if (
hours || minutes)
229 fprintf(
out,
"%dM", minutes);
230 fprintf(
out,
"%d.%0*dS", seconds, decimals, fractions);
237 struct Track **adaptation_sets_buf[2] = {
NULL };
238 struct Track ***adaptation_sets;
239 int nb_tracks_buf[2] = { 0 };
244 adaptation_sets = adaptation_sets_buf;
245 nb_tracks = nb_tracks_buf;
247 for (
i = 0;
i < 2;
i++) {
249 if (!adaptation_sets[
i]) {
262 adaptation_sets[set_index][nb_tracks[set_index]++] = tracks->
tracks[
i];
265 adaptation_sets = &tracks->
tracks;
270 out = fopen(filename,
"w");
276 fprintf(
out,
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
277 fprintf(
out,
"<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
278 "\txmlns=\"urn:mpeg:dash:schema:mpd:2011\"\n"
279 "\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n"
280 "\txsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd\"\n"
281 "\tprofiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\"\n"
282 "\ttype=\"static\"\n");
283 fprintf(
out,
"\tmediaPresentationDuration=\"");
285 fprintf(
out,
"\"\n");
286 fprintf(
out,
"\tminBufferTime=\"PT5S\">\n");
288 fprintf(
out,
"\t<Period start=\"PT0.0S\">\n");
291 if (nb_tracks[
set] == 0)
293 fprintf(
out,
"\t\t<AdaptationSet segmentAlignment=\"true\">\n");
295 for (
i = 0;
i < nb_tracks[
set];
i++) {
296 struct Track *track = adaptation_sets[
set][
i];
297 if (strcmp(track->
name, adaptation_sets[
set][0]->
name))
299 fprintf(
out,
"\t\t\t<ContentComponent id=\"%d\" contentType=\"%s\" />\n", track->
track_id, track->
is_audio ?
"audio" :
"video");
303 for (
i = 0;
i < nb_tracks[
set]; ) {
304 struct Track *first_track = adaptation_sets[
set][
i];
306 fprintf(
out,
"\t\t\t<Representation id=\"%d\" codecs=\"",
i);
307 for (j =
i; j < nb_tracks[
set]; j++) {
308 struct Track *track = adaptation_sets[
set][j];
309 if (strcmp(track->
name, first_track->
name))
324 fprintf(
out,
"\" mimeType=\"%s/mp4\" bandwidth=\"%d\"",
332 fprintf(
out,
"\t\t\t\t<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"%d\" />\n",
channels);
333 fprintf(
out,
"\t\t\t\t<BaseURL>%s</BaseURL>\n", first_track->
name);
335 fprintf(
out,
"\t\t\t</Representation>\n");
338 fprintf(
out,
"\t\t</AdaptationSet>\n");
340 fprintf(
out,
"\t</Period>\n");
341 fprintf(
out,
"</MPD>\n");
345 for (
i = 0;
i < 2;
i++)
360 int main(
int argc,
char **argv)
366 for (
i = 1;
i < argc;
i++) {
367 if (!strcmp(argv[
i],
"-out")) {
370 }
else if (argv[
i][0] ==
'-') {
371 return usage(argv[0], 1);
378 return usage(argv[0], 1);
static void set_codec_str(AVCodecParameters *codecpar, char *str, int size)
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
enum AVMediaType codec_type
General type of the encoded data.
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
This struct describes the properties of an encoded stream.
static int handle_file(struct Tracks *tracks, const char *file)
AVStream ** streams
A list of all streams in the file.
AVRounding
Rounding methods.
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int avio_open2(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
Put a description of the AVERROR code errnum in errbuf.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static int usage(const char *argv0, int ret)
@ AV_ROUND_UP
Round toward +infinity.
static void clean_tracks(struct Tracks *tracks)
static int find_sidx(struct Tracks *tracks, int start_index, const char *file)
int64_t duration
Decoding: duration of the stream, in stream time base.
unsigned int avio_rb32(AVIOContext *s)
static void set(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f, double v)
static void write_time(FILE *out, int64_t time, int decimals, enum AVRounding round)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
AVCodecParameters * codecpar
Codec parameters associated with this stream.
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new please make sure they are as small as space on each network bandwidth and so on benefit from smaller test cases Also keep in mind older checkouts use existing sample that means in practice generally do not remove or overwrite files as it likely would break older checkouts or releases Also all needed samples for a commit should be ideally hours
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int sample_rate
Audio only.
int extradata_size
Size of the extradata content in bytes.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
int multiple_tracks_per_file
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
#define MKBETAG(a, b, c, d)
#define i(width, name, range_min, range_max)
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
static av_always_inline av_const double round(double x)
#define AV_TIME_BASE
Internal time base represented as integer.
#define av_malloc_array(a, b)
@ AV_ROUND_DOWN
Round toward -infinity.
int id
Format-specific stream ID.
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration file
static int output_mpd(struct Tracks *tracks, const char *filename)
int main(int argc, char **argv)
#define AVIO_FLAG_READ
read-only
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).