lavf/asfenc: add support for setting packet size
This can provide a manual workaround for ticket #4230. Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
22bbd6e8b7
commit
6d14e32555
@ -37,6 +37,26 @@ ID3v2.3 and ID3v2.4) are supported. The default is version 4.
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@anchor{asf}
|
||||||
|
@section asf
|
||||||
|
|
||||||
|
Advanced Systems Format muxer.
|
||||||
|
|
||||||
|
Note that Windows Media Audio (wma) and Windows Media Video (wmv) use this
|
||||||
|
muxer too.
|
||||||
|
|
||||||
|
@subsection Options
|
||||||
|
|
||||||
|
It accepts the following options:
|
||||||
|
|
||||||
|
@table @option
|
||||||
|
@item packet_size
|
||||||
|
Set the muxer packet size. By tuning this setting you may reduce data
|
||||||
|
fragmentation or muxer overhead depending on your source. Default value is
|
||||||
|
3200, minimum is 100, maximum is 64k.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
@anchor{chromaprint}
|
@anchor{chromaprint}
|
||||||
@section chromaprint
|
@section chromaprint
|
||||||
|
|
||||||
|
@ -26,8 +26,6 @@
|
|||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
#include "riff.h"
|
#include "riff.h"
|
||||||
|
|
||||||
#define PACKET_SIZE 3200
|
|
||||||
|
|
||||||
typedef enum ASFDataType {
|
typedef enum ASFDataType {
|
||||||
ASF_UNICODE = 0,
|
ASF_UNICODE = 0,
|
||||||
ASF_BYTE_ARRAY = 1,
|
ASF_BYTE_ARRAY = 1,
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "avlanguage.h"
|
#include "avlanguage.h"
|
||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
@ -172,19 +173,20 @@
|
|||||||
ASF_PAYLOAD_REPLICATED_DATA_LENGTH + \
|
ASF_PAYLOAD_REPLICATED_DATA_LENGTH + \
|
||||||
ASF_PAYLOAD_LENGTH_FIELD_SIZE)
|
ASF_PAYLOAD_LENGTH_FIELD_SIZE)
|
||||||
|
|
||||||
#define SINGLE_PAYLOAD_DATA_LENGTH \
|
#define SINGLE_PAYLOAD_HEADERS \
|
||||||
(PACKET_SIZE - \
|
(PACKET_HEADER_MIN_SIZE + \
|
||||||
PACKET_HEADER_MIN_SIZE - \
|
|
||||||
PAYLOAD_HEADER_SIZE_SINGLE_PAYLOAD)
|
PAYLOAD_HEADER_SIZE_SINGLE_PAYLOAD)
|
||||||
|
|
||||||
#define MULTI_PAYLOAD_CONSTANT \
|
#define MULTI_PAYLOAD_HEADERS \
|
||||||
(PACKET_SIZE - \
|
(PACKET_HEADER_MIN_SIZE + \
|
||||||
PACKET_HEADER_MIN_SIZE - \
|
1 + /* Payload Flags */ \
|
||||||
1 - /* Payload Flags */ \
|
|
||||||
2 * PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS)
|
2 * PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS)
|
||||||
|
|
||||||
#define DATA_HEADER_SIZE 50
|
#define DATA_HEADER_SIZE 50
|
||||||
|
|
||||||
|
#define PACKET_SIZE_MAX 65536
|
||||||
|
#define PACKET_SIZE_MIN 100
|
||||||
|
|
||||||
typedef struct ASFPayload {
|
typedef struct ASFPayload {
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint16_t size;
|
uint16_t size;
|
||||||
@ -234,7 +236,7 @@ typedef struct ASFContext {
|
|||||||
int64_t packet_timestamp_start;
|
int64_t packet_timestamp_start;
|
||||||
int64_t packet_timestamp_end;
|
int64_t packet_timestamp_end;
|
||||||
unsigned int packet_nb_payloads;
|
unsigned int packet_nb_payloads;
|
||||||
uint8_t packet_buf[PACKET_SIZE];
|
uint8_t packet_buf[PACKET_SIZE_MAX];
|
||||||
AVIOContext pb;
|
AVIOContext pb;
|
||||||
/* only for reading */
|
/* only for reading */
|
||||||
uint64_t data_offset; ///< beginning of the first data packet
|
uint64_t data_offset; ///< beginning of the first data packet
|
||||||
@ -247,6 +249,7 @@ typedef struct ASFContext {
|
|||||||
uint64_t next_packet_offset;
|
uint64_t next_packet_offset;
|
||||||
int next_start_sec;
|
int next_start_sec;
|
||||||
int end_sec;
|
int end_sec;
|
||||||
|
int packet_size;
|
||||||
} ASFContext;
|
} ASFContext;
|
||||||
|
|
||||||
static const AVCodecTag codec_asf_bmp_tags[] = {
|
static const AVCodecTag codec_asf_bmp_tags[] = {
|
||||||
@ -755,7 +758,7 @@ static int asf_write_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
ASFContext *asf = s->priv_data;
|
ASFContext *asf = s->priv_data;
|
||||||
|
|
||||||
s->packet_size = PACKET_SIZE;
|
s->packet_size = asf->packet_size;
|
||||||
s->max_interleave_delta = 0;
|
s->max_interleave_delta = 0;
|
||||||
asf->nb_packets = 0;
|
asf->nb_packets = 0;
|
||||||
|
|
||||||
@ -866,7 +869,7 @@ static void flush_packet(AVFormatContext *s)
|
|||||||
asf->packet_nb_payloads,
|
asf->packet_nb_payloads,
|
||||||
asf->packet_size_left);
|
asf->packet_size_left);
|
||||||
|
|
||||||
packet_filled_size = PACKET_SIZE - asf->packet_size_left;
|
packet_filled_size = asf->packet_size - asf->packet_size_left;
|
||||||
av_assert0(packet_hdr_size <= asf->packet_size_left);
|
av_assert0(packet_hdr_size <= asf->packet_size_left);
|
||||||
memset(asf->packet_buf + packet_filled_size, 0, asf->packet_size_left);
|
memset(asf->packet_buf + packet_filled_size, 0, asf->packet_size_left);
|
||||||
|
|
||||||
@ -923,13 +926,14 @@ static void put_frame(AVFormatContext *s, ASFStream *stream, AVStream *avst,
|
|||||||
while (m_obj_offset < m_obj_size) {
|
while (m_obj_offset < m_obj_size) {
|
||||||
payload_len = m_obj_size - m_obj_offset;
|
payload_len = m_obj_size - m_obj_offset;
|
||||||
if (asf->packet_timestamp_start == -1) {
|
if (asf->packet_timestamp_start == -1) {
|
||||||
asf->multi_payloads_present = (payload_len < MULTI_PAYLOAD_CONSTANT);
|
const int multi_payload_constant = (asf->packet_size - MULTI_PAYLOAD_HEADERS);
|
||||||
|
asf->multi_payloads_present = (payload_len < multi_payload_constant);
|
||||||
|
|
||||||
asf->packet_size_left = PACKET_SIZE;
|
asf->packet_size_left = asf->packet_size;
|
||||||
if (asf->multi_payloads_present) {
|
if (asf->multi_payloads_present) {
|
||||||
frag_len1 = MULTI_PAYLOAD_CONSTANT - 1;
|
frag_len1 = multi_payload_constant - 1;
|
||||||
} else {
|
} else {
|
||||||
frag_len1 = SINGLE_PAYLOAD_DATA_LENGTH;
|
frag_len1 = asf->packet_size - SINGLE_PAYLOAD_HEADERS;
|
||||||
}
|
}
|
||||||
asf->packet_timestamp_start = timestamp;
|
asf->packet_timestamp_start = timestamp;
|
||||||
} else {
|
} else {
|
||||||
@ -1124,11 +1128,16 @@ static int asf_write_trailer(AVFormatContext *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const AVOption asf_options[] = {
|
||||||
|
{ "packet_size", "Packet size", offsetof(ASFContext, packet_size), AV_OPT_TYPE_INT, {.i64 = 3200}, PACKET_SIZE_MIN, PACKET_SIZE_MAX, AV_OPT_FLAG_ENCODING_PARAM },
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
#if CONFIG_ASF_MUXER
|
#if CONFIG_ASF_MUXER
|
||||||
static const AVClass asf_muxer_class = {
|
static const AVClass asf_muxer_class = {
|
||||||
.class_name = "ASF muxer",
|
.class_name = "ASF muxer",
|
||||||
.item_name = av_default_item_name,
|
.item_name = av_default_item_name,
|
||||||
.option = 0,
|
.option = asf_options,
|
||||||
.version = LIBAVUTIL_VERSION_INT,
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1155,7 +1164,7 @@ AVOutputFormat ff_asf_muxer = {
|
|||||||
static const AVClass asf_stream_muxer_class = {
|
static const AVClass asf_stream_muxer_class = {
|
||||||
.class_name = "ASF stream muxer",
|
.class_name = "ASF stream muxer",
|
||||||
.item_name = av_default_item_name,
|
.item_name = av_default_item_name,
|
||||||
.option = 0,
|
.option = asf_options,
|
||||||
.version = LIBAVUTIL_VERSION_INT,
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 57
|
#define LIBAVFORMAT_VERSION_MAJOR 57
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 24
|
#define LIBAVFORMAT_VERSION_MINOR 24
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 100
|
#define LIBAVFORMAT_VERSION_MICRO 101
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user