Compare commits

...

9 Commits

Author SHA1 Message Date
Derek Buitenhuis 1f8e5b6d95 doc/protocols: Fill in missing HTTP options
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:21:25 +01:00
Derek Buitenhuis 5d568b16a0 doc/protocols: Re-order HTTP options to match http.c order
This makes the list easier to maintain.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:20:28 +01:00
Derek Buitenhuis 31de02cf31 avformat/http: Add option to limit total reconnect delay
The existing option only allows users to set the max delay for a
single attempt, rather than the total allowed delay, which is both
pretty unintitive, and only applicable when exponential backoff is
used.

The default for this option is set to 256, which is just above the
effective total delay accomplished by the the existing
reconnect_delay_max default of 120.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:19:50 +01:00
Derek Buitenhuis 10374ab5ed avformat/http: Add options to set the max number of connection retries
Not every use case benefits from setting retries in terms of the backoff.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:17:33 +01:00
Derek Buitenhuis a776d524e1 avformat/http: Rename attempts to auth_attempts
This accurately reflects what it does, as per
e75bbcf493.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:15:32 +01:00
Derek Buitenhuis fa00624693 avformat/http: Don't bail on parsing headers on "bad" HTTP codes
Many "bad" HTTP codes like 429 and 503 may include important info in
their headers.

Also, in general, there is no purpose in bailing here.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:15:08 +01:00
Derek Buitenhuis b79260550b avformat/http: Use AVERROR_HTTP_TOO_MANY_REQUESTS
Added in the previous commit.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:14:36 +01:00
Derek Buitenhuis bcae59b898 avutil/error: Add HTTP 429 Too Many Requests AVERROR code
This is a common error code from e.g. CDNs or cloud storage, and
it is useful to be able to handle it differently to a generic
4XX code.

Its source is RFC6585.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
2024-04-25 14:13:47 +01:00
James Almer 5fc4a824db fate/iamf: don't demux packets in fate-iamf-5_1-{copy,demux}
They contain side data whose size is arch dependent.
This fixes fate failures on 32bit targets.

Signed-off-by: James Almer <jamrial@gmail.com>
2024-04-25 09:36:19 -03:00
9 changed files with 140 additions and 282 deletions

View File

@ -442,9 +442,6 @@ value is -1.
@item chunked_post
If set to 1 use chunked Transfer-Encoding for posts, default is 1.
@item content_type
Set a specific content type for the POST messages or for listen mode.
@item http_proxy
set HTTP proxy to tunnel through e.g. http://example.com:1234
@ -452,42 +449,33 @@ set HTTP proxy to tunnel through e.g. http://example.com:1234
Set custom HTTP headers, can override built in default headers. The
value must be a string encoding the headers.
@item content_type
Set a specific content type for the POST messages or for listen mode.
@item user_agent
Override the User-Agent header. If not specified the protocol will use a
string describing the libavformat build. ("Lavf/<version>")
@item referer
Set the Referer header. Include 'Referer: URL' header in HTTP request.
@item multiple_requests
Use persistent connections if set to 1, default is 0.
@item post_data
Set custom HTTP post data.
@item referer
Set the Referer header. Include 'Referer: URL' header in HTTP request.
@item user_agent
Override the User-Agent header. If not specified the protocol will use a
string describing the libavformat build. ("Lavf/<version>")
@item reconnect_at_eof
If set then eof is treated like an error and causes reconnection, this is useful
for live / endless streams.
@item reconnect_streamed
If set then even streamed/non seekable streams will be reconnected on errors.
@item reconnect_on_network_error
Reconnect automatically in case of TCP/TLS errors during connect.
@item reconnect_on_http_error
A comma separated list of HTTP status codes to reconnect on. The list can
include specific status codes (e.g. '503') or the strings '4xx' / '5xx'.
@item reconnect_delay_max
Sets the maximum delay in seconds after which to give up reconnecting
@item mime_type
Export the MIME type.
@item http_version
Exports the HTTP response version number. Usually "1.0" or "1.1".
@item cookies
Set the cookies to be sent in future requests. The format of each cookie is the
same as the value of a Set-Cookie HTTP response field. Multiple cookies can be
delimited by a newline character.
@item icy
If set to 1 request ICY (SHOUTcast) metadata from the server. If the server
supports this, the metadata has to be retrieved by the application by reading
@ -504,10 +492,40 @@ contains the last non-empty metadata packet sent by the server. It should be
polled in regular intervals by applications interested in mid-stream metadata
updates.
@item cookies
Set the cookies to be sent in future requests. The format of each cookie is the
same as the value of a Set-Cookie HTTP response field. Multiple cookies can be
delimited by a newline character.
@item metadata
Set an exported dictionary containing Icecast metadata from the bitstream, if present.
Only useful with the C API.
@item auth_type
Set HTTP authentication type. No option for Digest, since this method requires
getting nonce parameters from the server first and can't be used straight away like
Basic.
@table @option
@item none
Choose the HTTP authentication type automatically. This is the default.
@item basic
Choose the HTTP basic authentication.
Basic authentication sends a Base64-encoded string that contains a user name and password
for the client. Base64 is not a form of encryption and should be considered the same as
sending the user name and password in clear text (Base64 is a reversible encoding).
If a resource needs to be protected, strongly consider using an authentication scheme
other than basic authentication. HTTPS/TLS should be used with basic authentication.
Without these additional security enhancements, basic authentication should not be used
to protect sensitive or valuable information.
@end table
@item send_expect_100
Send an Expect: 100-continue header for POST. If set to 1 it will send, if set
to 0 it won't, if set to -1 it will try to send if it is applicable. Default
value is -1.
@item location
An exported dictionary containing the content location. Only useful with the C
API.
@item offset
Set initial byte offset.
@ -525,6 +543,32 @@ be given a Bad Request response.
When unset the HTTP method is not checked for now. This will be replaced by
autodetection in the future.
@item reconnect
Reconnect automatically when disconnected before EOF is hit.
@item reconnect_at_eof
If set then eof is treated like an error and causes reconnection, this is useful
for live / endless streams.
@item reconnect_on_network_error
Reconnect automatically in case of TCP/TLS errors during connect.
@item reconnect_on_http_error
A comma separated list of HTTP status codes to reconnect on. The list can
include specific status codes (e.g. '503') or the strings '4xx' / '5xx'.
@item reconnect_streamed
If set then even streamed/non seekable streams will be reconnected on errors.
@item reconnect_delay_max
Set the maximum delay in seconds after which to give up reconnecting.
@item reconnect_max_retries
Set the maximum number of times to retry a connection. Default unset.
@item reconnect_delay_total_max
Set the maximum total delay in seconds after which to give up reconnecting.
@item listen
If set to 1 enables experimental HTTP server. This can be used to send data when
used as an output option, or read data from a client with HTTP POST when used as
@ -551,32 +595,16 @@ ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://@var{server}:@var{p
wget --post-file=somefile.ogg http://@var{server}:@var{port}
@end example
@item send_expect_100
Send an Expect: 100-continue header for POST. If set to 1 it will send, if set
to 0 it won't, if set to -1 it will try to send if it is applicable. Default
value is -1.
@item resource
The resource requested by a client, when the experimental HTTP server is in use.
@item auth_type
@item reply_code
The HTTP code returned to the client, when the experimental HTTP server is in use.
Set HTTP authentication type. No option for Digest, since this method requires
getting nonce parameters from the server first and can't be used straight away like
Basic.
@table @option
@item none
Choose the HTTP authentication type automatically. This is the default.
@item basic
Choose the HTTP basic authentication.
Basic authentication sends a Base64-encoded string that contains a user name and password
for the client. Base64 is not a form of encryption and should be considered the same as
sending the user name and password in clear text (Base64 is a reversible encoding).
If a resource needs to be protected, strongly consider using an authentication scheme
other than basic authentication. HTTPS/TLS should be used with basic authentication.
Without these additional security enhancements, basic authentication should not be used
to protect sensitive or valuable information.
@end table
@item short_seek_size
Set the threshold, in bytes, for when a readahead should be prefered over a seek and
new HTTP request. This is useful, for example, to make sure the same connection
is used for reading large video packets with small audio packets in between.
@end table

View File

@ -138,6 +138,8 @@ typedef struct HTTPContext {
char *new_location;
AVDictionary *redirect_cache;
uint64_t filesize_from_content_range;
int reconnect_max_retries;
int reconnect_delay_total_max;
} HTTPContext;
#define OFFSET(x) offsetof(HTTPContext, x)
@ -176,6 +178,8 @@ static const AVOption options[] = {
{ "reconnect_on_http_error", "list of http status codes to reconnect on", OFFSET(reconnect_on_http_error), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D },
{ "reconnect_streamed", "auto reconnect streamed / non seekable streams", OFFSET(reconnect_streamed), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D },
{ "reconnect_delay_max", "max reconnect delay in seconds after which to give up", OFFSET(reconnect_delay_max), AV_OPT_TYPE_INT, { .i64 = 120 }, 0, UINT_MAX/1000/1000, D },
{ "reconnect_max_retries", "the max number of times to retry a connection", OFFSET(reconnect_max_retries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, D },
{ "reconnect_delay_total_max", "max total reconnect delay in seconds after which to give up", OFFSET(reconnect_delay_total_max), AV_OPT_TYPE_INT, { .i64 = 256 }, 0, UINT_MAX/1000/1000, D },
{ "listen", "listen on HTTP", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, D | E },
{ "resource", "The resource requested by a client", OFFSET(resource), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E },
{ "reply_code", "The http status code to return to a client", OFFSET(reply_code), AV_OPT_TYPE_INT, { .i64 = 200}, INT_MIN, 599, E},
@ -286,6 +290,7 @@ static int http_should_reconnect(HTTPContext *s, int err)
case AVERROR_HTTP_UNAUTHORIZED:
case AVERROR_HTTP_FORBIDDEN:
case AVERROR_HTTP_NOT_FOUND:
case AVERROR_HTTP_TOO_MANY_REQUESTS:
case AVERROR_HTTP_OTHER_4XX:
status_group = "4xx";
break;
@ -355,8 +360,9 @@ static int http_open_cnx(URLContext *h, AVDictionary **options)
{
HTTPAuthType cur_auth_type, cur_proxy_auth_type;
HTTPContext *s = h->priv_data;
int ret, attempts = 0, redirects = 0;
int ret, conn_attempts = 1, auth_attempts = 0, redirects = 0;
int reconnect_delay = 0;
int reconnect_delay_total = 0;
uint64_t off;
char *cached;
@ -382,14 +388,18 @@ redo:
ret = http_open_cnx_internal(h, options);
if (ret < 0) {
if (!http_should_reconnect(s, ret) ||
reconnect_delay > s->reconnect_delay_max)
reconnect_delay > s->reconnect_delay_max ||
(s->reconnect_max_retries >= 0 && conn_attempts > s->reconnect_max_retries) ||
reconnect_delay_total > s->reconnect_delay_total_max)
goto fail;
av_log(h, AV_LOG_WARNING, "Will reconnect at %"PRIu64" in %d second(s).\n", off, reconnect_delay);
ret = ff_network_sleep_interruptible(1000U * 1000 * reconnect_delay, &h->interrupt_callback);
if (ret != AVERROR(ETIMEDOUT))
goto fail;
reconnect_delay_total += reconnect_delay;
reconnect_delay = 1 + 2 * reconnect_delay;
conn_attempts++;
/* restore the offset (http_connect resets it) */
s->off = off;
@ -398,10 +408,10 @@ redo:
goto redo;
}
attempts++;
auth_attempts++;
if (s->http_code == 401) {
if ((cur_auth_type == HTTP_AUTH_NONE || s->auth_state.stale) &&
s->auth_state.auth_type != HTTP_AUTH_NONE && attempts < 4) {
s->auth_state.auth_type != HTTP_AUTH_NONE && auth_attempts < 4) {
ffurl_closep(&s->hd);
goto redo;
} else
@ -409,7 +419,7 @@ redo:
}
if (s->http_code == 407) {
if ((cur_proxy_auth_type == HTTP_AUTH_NONE || s->proxy_auth_state.stale) &&
s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && attempts < 4) {
s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && auth_attempts < 4) {
ffurl_closep(&s->hd);
goto redo;
} else
@ -438,7 +448,7 @@ redo:
/* Restart the authentication process with the new target, which
* might use a different auth mechanism. */
memset(&s->auth_state, 0, sizeof(s->auth_state));
attempts = 0;
auth_attempts = 0;
goto redo;
}
return 0;
@ -522,6 +532,7 @@ int ff_http_averror(int status_code, int default_averror)
case 401: return AVERROR_HTTP_UNAUTHORIZED;
case 403: return AVERROR_HTTP_FORBIDDEN;
case 404: return AVERROR_HTTP_NOT_FOUND;
case 429: return AVERROR_HTTP_TOO_MANY_REQUESTS;
default: break;
}
if (status_code >= 400 && status_code <= 499)
@ -558,6 +569,11 @@ static int http_write_reply(URLContext* h, int status_code)
reply_code = 404;
reply_text = "Not Found";
break;
case AVERROR_HTTP_TOO_MANY_REQUESTS:
case 429:
reply_code = 429;
reply_text = "Too Many Requests";
break;
case 200:
reply_code = 200;
reply_text = "OK";
@ -1080,7 +1096,7 @@ static void parse_cache_control(HTTPContext *s, const char *p)
}
}
static int process_line(URLContext *h, char *line, int line_count)
static int process_line(URLContext *h, char *line, int line_count, int *parsed_http_code)
{
HTTPContext *s = h->priv_data;
const char *auto_method = h->flags & AVIO_FLAG_READ ? "POST" : "GET";
@ -1160,6 +1176,8 @@ static int process_line(URLContext *h, char *line, int line_count)
av_log(h, AV_LOG_TRACE, "http_code=%d\n", s->http_code);
*parsed_http_code = 1;
if ((ret = check_http_code(h, s->http_code, end)) < 0)
return ret;
}
@ -1332,7 +1350,7 @@ static int http_read_header(URLContext *h)
{
HTTPContext *s = h->priv_data;
char line[MAX_URL_SIZE];
int err = 0;
int err = 0, http_err = 0;
av_freep(&s->new_location);
s->expires = 0;
@ -1340,18 +1358,31 @@ static int http_read_header(URLContext *h)
s->filesize_from_content_range = UINT64_MAX;
for (;;) {
int parsed_http_code = 0;
if ((err = http_get_line(s, line, sizeof(line))) < 0)
return err;
av_log(h, AV_LOG_TRACE, "header='%s'\n", line);
err = process_line(h, line, s->line_count);
if (err < 0)
return err;
err = process_line(h, line, s->line_count, &parsed_http_code);
if (err < 0) {
if (parsed_http_code) {
http_err = err;
} else {
/* Prefer to return HTTP code error if we've already seen one. */
if (http_err)
return http_err;
else
return err;
}
}
if (err == 0)
break;
s->line_count++;
}
if (http_err)
return http_err;
// filesize from Content-Range can always be used, even if using chunked Transfer-Encoding
if (s->filesize_from_content_range != UINT64_MAX)
@ -1673,6 +1704,8 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size)
int err, read_ret;
int64_t seek_ret;
int reconnect_delay = 0;
int reconnect_delay_total = 0;
int conn_attempts = 1;
if (!s->hd)
return AVERROR_EOF;
@ -1701,14 +1734,17 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size)
!(s->reconnect_at_eof && read_ret == AVERROR_EOF))
break;
if (reconnect_delay > s->reconnect_delay_max)
if (reconnect_delay > s->reconnect_delay_max || (s->reconnect_max_retries >= 0 && conn_attempts > s->reconnect_max_retries) ||
reconnect_delay_total > s->reconnect_delay_total_max)
return AVERROR(EIO);
av_log(h, AV_LOG_WARNING, "Will reconnect at %"PRIu64" in %d second(s), error=%s.\n", s->off, reconnect_delay, av_err2str(read_ret));
err = ff_network_sleep_interruptible(1000U*1000*reconnect_delay, &h->interrupt_callback);
if (err != AVERROR(ETIMEDOUT))
return err;
reconnect_delay_total += reconnect_delay;
reconnect_delay = 1 + 2*reconnect_delay;
conn_attempts++;
seek_ret = http_seek_internal(h, target, SEEK_SET, 1);
if (seek_ret >= 0 && seek_ret != target) {
av_log(h, AV_LOG_ERROR, "Failed to reconnect at %"PRIu64".\n", target);
@ -2049,7 +2085,7 @@ static int http_proxy_open(URLContext *h, const char *uri, int flags)
char hostname[1024], hoststr[1024];
char auth[1024], pathbuf[1024], *path;
char lower_url[100];
int port, ret = 0, attempts = 0;
int port, ret = 0, auth_attempts = 0;
HTTPAuthType cur_auth_type;
char *authstr;
@ -2109,10 +2145,10 @@ redo:
if (ret < 0)
goto fail;
attempts++;
auth_attempts++;
if (s->http_code == 407 &&
(cur_auth_type == HTTP_AUTH_NONE || s->proxy_auth_state.stale) &&
s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && attempts < 2) {
s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && auth_attempts < 2) {
ffurl_closep(&s->hd);
goto redo;
}

View File

@ -32,7 +32,7 @@
#include "version_major.h"
#define LIBAVFORMAT_VERSION_MINOR 3
#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_MICRO 102
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \

View File

@ -61,6 +61,7 @@ static const struct error_entry error_entries[] = {
{ ERROR_TAG(HTTP_UNAUTHORIZED), "Server returned 401 Unauthorized (authorization failed)" },
{ ERROR_TAG(HTTP_FORBIDDEN), "Server returned 403 Forbidden (access denied)" },
{ ERROR_TAG(HTTP_NOT_FOUND), "Server returned 404 Not Found" },
{ ERROR_TAG(HTTP_TOO_MANY_REQUESTS), "Server returned 429 Too Many Requests" },
{ ERROR_TAG(HTTP_OTHER_4XX), "Server returned 4XX Client Error, but not one of 40{0,1,3,4}" },
{ ERROR_TAG(HTTP_SERVER_ERROR), "Server returned 5XX Server Error reply" },
#if !HAVE_STRERROR_R

View File

@ -79,6 +79,7 @@
#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1')
#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3')
#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4')
#define AVERROR_HTTP_TOO_MANY_REQUESTS FFERRTAG(0xF8,'4','2','9')
#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X')
#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X')

View File

@ -80,7 +80,7 @@
#define LIBAVUTIL_VERSION_MAJOR 59
#define LIBAVUTIL_VERSION_MINOR 16
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_MICRO 101
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \

View File

@ -39,12 +39,12 @@ fate-iamf-ambisonic_1: CMD = transcode wav $(SRC) iamf "-auto_conversion_filters
FATE_IAMF_SAMPLES-$(call FRAMECRC, IAMF, OPUS) += fate-iamf-5_1-demux
fate-iamf-5_1-demux: CMD = stream_demux iamf $(TARGET_SAMPLES)/iamf/test_000059.iamf "" \
"-c:a copy -map 0" \
"-c:a copy -frames:a 0 -map 0" \
"-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
FATE_IAMF_SAMPLES-$(call REMUX, IAMF, OPUS_DECODER) += fate-iamf-5_1-copy
fate-iamf-5_1-copy: CMD = stream_remux iamf $(TARGET_SAMPLES)/iamf/test_000059.iamf "" iamf \
"-map 0 -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3" "" "-c:a copy -map 0" \
"-map 0 -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3" "" "-c:a copy -frames:a 0 -map 0" \
"-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
FATE_IAMF += $(FATE_IAMF-yes)

View File

@ -22,110 +22,6 @@
#codec_id 3: opus
#sample_rate 3: 48000
#channel_layout_name 3: mono
0, 0, 0, 960, 371, 0x552eba36, S=3, 10, 96, 136
1, 0, 0, 960, 381, 0x6779b329, S=3, 10, 96, 136
2, 0, 0, 960, 66, 0x4ce02142, S=3, 10, 96, 136
3, 0, 0, 960, 67, 0x935223f9, S=3, 10, 96, 136
0, 960, 960, 960, 313, 0xa5e19a4f, S=2, 96, 136
1, 960, 960, 960, 339, 0xf83daf6a, S=2, 96, 136
2, 960, 960, 960, 62, 0x80c91ca8, S=2, 96, 136
3, 960, 960, 960, 64, 0xaae41dd7, S=2, 96, 136
0, 1920, 1920, 960, 210, 0x5fc26f7a, S=2, 96, 136
1, 1920, 1920, 960, 207, 0xc8c768e8, S=2, 96, 136
2, 1920, 1920, 960, 75, 0x85012598, S=2, 96, 136
3, 1920, 1920, 960, 94, 0x5dc52d3b, S=2, 96, 136
0, 2880, 2880, 960, 211, 0x8f006c62, S=2, 96, 136
1, 2880, 2880, 960, 215, 0x30c8674d, S=2, 96, 136
2, 2880, 2880, 960, 88, 0x46772b87, S=2, 96, 136
3, 2880, 2880, 960, 105, 0x831c3191, S=2, 96, 136
0, 3840, 3840, 960, 340, 0x3c92a527, S=2, 96, 136
1, 3840, 3840, 960, 303, 0x65e09e91, S=2, 96, 136
2, 3840, 3840, 960, 121, 0xc45d3ec1, S=2, 96, 136
3, 3840, 3840, 960, 126, 0xff3a44d7, S=2, 96, 136
0, 4800, 4800, 960, 206, 0x3087662a, S=2, 96, 136
1, 4800, 4800, 960, 206, 0xd2b469de, S=2, 96, 136
2, 4800, 4800, 960, 124, 0xd9423baf, S=2, 96, 136
3, 4800, 4800, 960, 121, 0x24073ab0, S=2, 96, 136
0, 5760, 5760, 960, 212, 0x85686b01, S=2, 96, 136
1, 5760, 5760, 960, 230, 0x7ce56f22, S=2, 96, 136
2, 5760, 5760, 960, 128, 0xca6840ad, S=2, 96, 136
3, 5760, 5760, 960, 138, 0xa1f24207, S=2, 96, 136
0, 6720, 6720, 960, 220, 0xd40572ca, S=2, 96, 136
1, 6720, 6720, 960, 223, 0x760c74ce, S=2, 96, 136
2, 6720, 6720, 960, 125, 0xd0674094, S=2, 96, 136
3, 6720, 6720, 960, 130, 0x58f64293, S=2, 96, 136
0, 7680, 7680, 960, 249, 0x9b6c77bb, S=2, 96, 136
1, 7680, 7680, 960, 247, 0x660475b6, S=2, 96, 136
2, 7680, 7680, 960, 125, 0x43de3911, S=2, 96, 136
3, 7680, 7680, 960, 122, 0x0d4137b3, S=2, 96, 136
0, 8640, 8640, 960, 262, 0x0d718316, S=2, 96, 136
1, 8640, 8640, 960, 260, 0xce698563, S=2, 96, 136
2, 8640, 8640, 960, 121, 0x7f1b4025, S=2, 96, 136
3, 8640, 8640, 960, 121, 0xdae34205, S=2, 96, 136
0, 9600, 9600, 960, 266, 0x6ffb86f0, S=2, 96, 136
1, 9600, 9600, 960, 266, 0xa16f87bb, S=2, 96, 136
2, 9600, 9600, 960, 119, 0x57703c74, S=2, 96, 136
3, 9600, 9600, 960, 114, 0x06853bf5, S=2, 96, 136
0, 10560, 10560, 960, 269, 0x43078081, S=2, 96, 136
1, 10560, 10560, 960, 255, 0xff767870, S=2, 96, 136
2, 10560, 10560, 960, 117, 0x86a43b70, S=2, 96, 136
3, 10560, 10560, 960, 114, 0x4be5388e, S=2, 96, 136
0, 11520, 11520, 960, 244, 0xd56f7885, S=2, 96, 136
1, 11520, 11520, 960, 241, 0xbd1777f2, S=2, 96, 136
2, 11520, 11520, 960, 110, 0xce96366a, S=2, 96, 136
3, 11520, 11520, 960, 109, 0x120234bd, S=2, 96, 136
0, 12480, 12480, 960, 241, 0xb8847e12, S=2, 96, 136
1, 12480, 12480, 960, 241, 0x1bd27430, S=2, 96, 136
2, 12480, 12480, 960, 127, 0x38ce3ff0, S=2, 96, 136
3, 12480, 12480, 960, 127, 0x9f763c9b, S=2, 96, 136
0, 13440, 13440, 960, 241, 0x9ee4787e, S=2, 96, 136
1, 13440, 13440, 960, 241, 0x85ad821d, S=2, 96, 136
2, 13440, 13440, 960, 141, 0xdc414884, S=2, 96, 136
3, 13440, 13440, 960, 134, 0x95c9405e, S=2, 96, 136
0, 14400, 14400, 960, 241, 0x060c78e3, S=2, 96, 136
1, 14400, 14400, 960, 241, 0x03bb7e7e, S=2, 96, 136
2, 14400, 14400, 960, 133, 0xfe184321, S=2, 96, 136
3, 14400, 14400, 960, 125, 0x70523d7d, S=2, 96, 136
0, 15360, 15360, 960, 241, 0xf7c57f6b, S=2, 96, 136
1, 15360, 15360, 960, 241, 0x58ed7656, S=2, 96, 136
2, 15360, 15360, 960, 119, 0x33b83af3, S=2, 96, 136
3, 15360, 15360, 960, 121, 0x3f353eb3, S=2, 96, 136
0, 16320, 16320, 960, 241, 0xc0077948, S=2, 96, 136
1, 16320, 16320, 960, 241, 0x886a7f2a, S=2, 96, 136
2, 16320, 16320, 960, 118, 0x122d3d16, S=2, 96, 136
3, 16320, 16320, 960, 123, 0x673d3bbd, S=2, 96, 136
0, 17280, 17280, 960, 241, 0x51777d39, S=2, 96, 136
1, 17280, 17280, 960, 241, 0x25aa7240, S=2, 96, 136
2, 17280, 17280, 960, 116, 0xe4ff3d75, S=2, 96, 136
3, 17280, 17280, 960, 114, 0x95c638df, S=2, 96, 136
0, 18240, 18240, 960, 241, 0x8a038527, S=2, 96, 136
1, 18240, 18240, 960, 241, 0x151877bf, S=2, 96, 136
2, 18240, 18240, 960, 116, 0xcb0238e6, S=2, 96, 136
3, 18240, 18240, 960, 122, 0xc1fb4201, S=2, 96, 136
0, 19200, 19200, 960, 241, 0xff1a839d, S=2, 96, 136
1, 19200, 19200, 960, 241, 0x243c7927, S=2, 96, 136
2, 19200, 19200, 960, 117, 0x4b723619, S=2, 96, 136
3, 19200, 19200, 960, 113, 0xccf439e2, S=2, 96, 136
0, 20160, 20160, 960, 241, 0x9aab7903, S=2, 96, 136
1, 20160, 20160, 960, 241, 0x718b795d, S=2, 96, 136
2, 20160, 20160, 960, 123, 0xd2fb3c10, S=2, 96, 136
3, 20160, 20160, 960, 130, 0x28d03f70, S=2, 96, 136
0, 21120, 21120, 960, 241, 0xc4246f83, S=2, 96, 136
1, 21120, 21120, 960, 241, 0xec9577fe, S=2, 96, 136
2, 21120, 21120, 960, 128, 0x269b4147, S=2, 96, 136
3, 21120, 21120, 960, 135, 0xeb5d473a, S=2, 96, 136
0, 22080, 22080, 960, 241, 0x4b69803f, S=2, 96, 136
1, 22080, 22080, 960, 241, 0xd9d37f47, S=2, 96, 136
2, 22080, 22080, 960, 122, 0x521c3fd0, S=2, 96, 136
3, 22080, 22080, 960, 123, 0x9f0c3b46, S=2, 96, 136
0, 23040, 23040, 960, 241, 0x2dbc77e4, S=2, 96, 136
1, 23040, 23040, 960, 241, 0x8a4e784f, S=2, 96, 136
2, 23040, 23040, 960, 179, 0xa53e5481, S=2, 96, 136
3, 23040, 23040, 960, 175, 0x18d157ee, S=2, 96, 136
0, 24000, 24000, 960, 241, 0x4f5b722d, S=3, 10, 96, 136
1, 24000, 24000, 960, 241, 0xc7e67e1e, S=3, 10, 96, 136
2, 24000, 24000, 960, 189, 0x736c5f4c, S=3, 10, 96, 136
3, 24000, 24000, 960, 189, 0x63256352, S=3, 10, 96, 136
[STREAM_GROUP]
index=0
id=0x12c

View File

@ -22,110 +22,6 @@
#codec_id 3: opus
#sample_rate 3: 48000
#channel_layout_name 3: mono
0, 0, 0, 960, 371, 0x552eba36, S=3, 10, 96, 136
1, 0, 0, 960, 381, 0x6779b329, S=3, 10, 96, 136
2, 0, 0, 960, 66, 0x4ce02142, S=3, 10, 96, 136
3, 0, 0, 960, 67, 0x935223f9, S=3, 10, 96, 136
0, 960, 960, 960, 313, 0xa5e19a4f, S=2, 96, 136
1, 960, 960, 960, 339, 0xf83daf6a, S=2, 96, 136
2, 960, 960, 960, 62, 0x80c91ca8, S=2, 96, 136
3, 960, 960, 960, 64, 0xaae41dd7, S=2, 96, 136
0, 1920, 1920, 960, 210, 0x5fc26f7a, S=2, 96, 136
1, 1920, 1920, 960, 207, 0xc8c768e8, S=2, 96, 136
2, 1920, 1920, 960, 75, 0x85012598, S=2, 96, 136
3, 1920, 1920, 960, 94, 0x5dc52d3b, S=2, 96, 136
0, 2880, 2880, 960, 211, 0x8f006c62, S=2, 96, 136
1, 2880, 2880, 960, 215, 0x30c8674d, S=2, 96, 136
2, 2880, 2880, 960, 88, 0x46772b87, S=2, 96, 136
3, 2880, 2880, 960, 105, 0x831c3191, S=2, 96, 136
0, 3840, 3840, 960, 340, 0x3c92a527, S=2, 96, 136
1, 3840, 3840, 960, 303, 0x65e09e91, S=2, 96, 136
2, 3840, 3840, 960, 121, 0xc45d3ec1, S=2, 96, 136
3, 3840, 3840, 960, 126, 0xff3a44d7, S=2, 96, 136
0, 4800, 4800, 960, 206, 0x3087662a, S=2, 96, 136
1, 4800, 4800, 960, 206, 0xd2b469de, S=2, 96, 136
2, 4800, 4800, 960, 124, 0xd9423baf, S=2, 96, 136
3, 4800, 4800, 960, 121, 0x24073ab0, S=2, 96, 136
0, 5760, 5760, 960, 212, 0x85686b01, S=2, 96, 136
1, 5760, 5760, 960, 230, 0x7ce56f22, S=2, 96, 136
2, 5760, 5760, 960, 128, 0xca6840ad, S=2, 96, 136
3, 5760, 5760, 960, 138, 0xa1f24207, S=2, 96, 136
0, 6720, 6720, 960, 220, 0xd40572ca, S=2, 96, 136
1, 6720, 6720, 960, 223, 0x760c74ce, S=2, 96, 136
2, 6720, 6720, 960, 125, 0xd0674094, S=2, 96, 136
3, 6720, 6720, 960, 130, 0x58f64293, S=2, 96, 136
0, 7680, 7680, 960, 249, 0x9b6c77bb, S=2, 96, 136
1, 7680, 7680, 960, 247, 0x660475b6, S=2, 96, 136
2, 7680, 7680, 960, 125, 0x43de3911, S=2, 96, 136
3, 7680, 7680, 960, 122, 0x0d4137b3, S=2, 96, 136
0, 8640, 8640, 960, 262, 0x0d718316, S=2, 96, 136
1, 8640, 8640, 960, 260, 0xce698563, S=2, 96, 136
2, 8640, 8640, 960, 121, 0x7f1b4025, S=2, 96, 136
3, 8640, 8640, 960, 121, 0xdae34205, S=2, 96, 136
0, 9600, 9600, 960, 266, 0x6ffb86f0, S=2, 96, 136
1, 9600, 9600, 960, 266, 0xa16f87bb, S=2, 96, 136
2, 9600, 9600, 960, 119, 0x57703c74, S=2, 96, 136
3, 9600, 9600, 960, 114, 0x06853bf5, S=2, 96, 136
0, 10560, 10560, 960, 269, 0x43078081, S=2, 96, 136
1, 10560, 10560, 960, 255, 0xff767870, S=2, 96, 136
2, 10560, 10560, 960, 117, 0x86a43b70, S=2, 96, 136
3, 10560, 10560, 960, 114, 0x4be5388e, S=2, 96, 136
0, 11520, 11520, 960, 244, 0xd56f7885, S=2, 96, 136
1, 11520, 11520, 960, 241, 0xbd1777f2, S=2, 96, 136
2, 11520, 11520, 960, 110, 0xce96366a, S=2, 96, 136
3, 11520, 11520, 960, 109, 0x120234bd, S=2, 96, 136
0, 12480, 12480, 960, 241, 0xb8847e12, S=2, 96, 136
1, 12480, 12480, 960, 241, 0x1bd27430, S=2, 96, 136
2, 12480, 12480, 960, 127, 0x38ce3ff0, S=2, 96, 136
3, 12480, 12480, 960, 127, 0x9f763c9b, S=2, 96, 136
0, 13440, 13440, 960, 241, 0x9ee4787e, S=2, 96, 136
1, 13440, 13440, 960, 241, 0x85ad821d, S=2, 96, 136
2, 13440, 13440, 960, 141, 0xdc414884, S=2, 96, 136
3, 13440, 13440, 960, 134, 0x95c9405e, S=2, 96, 136
0, 14400, 14400, 960, 241, 0x060c78e3, S=2, 96, 136
1, 14400, 14400, 960, 241, 0x03bb7e7e, S=2, 96, 136
2, 14400, 14400, 960, 133, 0xfe184321, S=2, 96, 136
3, 14400, 14400, 960, 125, 0x70523d7d, S=2, 96, 136
0, 15360, 15360, 960, 241, 0xf7c57f6b, S=2, 96, 136
1, 15360, 15360, 960, 241, 0x58ed7656, S=2, 96, 136
2, 15360, 15360, 960, 119, 0x33b83af3, S=2, 96, 136
3, 15360, 15360, 960, 121, 0x3f353eb3, S=2, 96, 136
0, 16320, 16320, 960, 241, 0xc0077948, S=2, 96, 136
1, 16320, 16320, 960, 241, 0x886a7f2a, S=2, 96, 136
2, 16320, 16320, 960, 118, 0x122d3d16, S=2, 96, 136
3, 16320, 16320, 960, 123, 0x673d3bbd, S=2, 96, 136
0, 17280, 17280, 960, 241, 0x51777d39, S=2, 96, 136
1, 17280, 17280, 960, 241, 0x25aa7240, S=2, 96, 136
2, 17280, 17280, 960, 116, 0xe4ff3d75, S=2, 96, 136
3, 17280, 17280, 960, 114, 0x95c638df, S=2, 96, 136
0, 18240, 18240, 960, 241, 0x8a038527, S=2, 96, 136
1, 18240, 18240, 960, 241, 0x151877bf, S=2, 96, 136
2, 18240, 18240, 960, 116, 0xcb0238e6, S=2, 96, 136
3, 18240, 18240, 960, 122, 0xc1fb4201, S=2, 96, 136
0, 19200, 19200, 960, 241, 0xff1a839d, S=2, 96, 136
1, 19200, 19200, 960, 241, 0x243c7927, S=2, 96, 136
2, 19200, 19200, 960, 117, 0x4b723619, S=2, 96, 136
3, 19200, 19200, 960, 113, 0xccf439e2, S=2, 96, 136
0, 20160, 20160, 960, 241, 0x9aab7903, S=2, 96, 136
1, 20160, 20160, 960, 241, 0x718b795d, S=2, 96, 136
2, 20160, 20160, 960, 123, 0xd2fb3c10, S=2, 96, 136
3, 20160, 20160, 960, 130, 0x28d03f70, S=2, 96, 136
0, 21120, 21120, 960, 241, 0xc4246f83, S=2, 96, 136
1, 21120, 21120, 960, 241, 0xec9577fe, S=2, 96, 136
2, 21120, 21120, 960, 128, 0x269b4147, S=2, 96, 136
3, 21120, 21120, 960, 135, 0xeb5d473a, S=2, 96, 136
0, 22080, 22080, 960, 241, 0x4b69803f, S=2, 96, 136
1, 22080, 22080, 960, 241, 0xd9d37f47, S=2, 96, 136
2, 22080, 22080, 960, 122, 0x521c3fd0, S=2, 96, 136
3, 22080, 22080, 960, 123, 0x9f0c3b46, S=2, 96, 136
0, 23040, 23040, 960, 241, 0x2dbc77e4, S=2, 96, 136
1, 23040, 23040, 960, 241, 0x8a4e784f, S=2, 96, 136
2, 23040, 23040, 960, 179, 0xa53e5481, S=2, 96, 136
3, 23040, 23040, 960, 175, 0x18d157ee, S=2, 96, 136
0, 24000, 24000, 960, 241, 0x4f5b722d, S=3, 10, 96, 136
1, 24000, 24000, 960, 241, 0xc7e67e1e, S=3, 10, 96, 136
2, 24000, 24000, 960, 189, 0x736c5f4c, S=3, 10, 96, 136
3, 24000, 24000, 960, 189, 0x63256352, S=3, 10, 96, 136
[STREAM_GROUP]
index=0
id=0x12c