Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9422cd85a0 | ||
![]() |
87c416d93a | ||
![]() |
607e5038a9 | ||
![]() |
a289b0b91a | ||
![]() |
842def7d78 | ||
![]() |
c38af02626 | ||
![]() |
7ce0f4ea3b | ||
![]() |
3193b85be3 | ||
![]() |
5c8845a554 | ||
![]() |
e5e048bbf7 | ||
![]() |
b276b913a1 | ||
![]() |
d89e14bf54 | ||
![]() |
4b846f0ccf | ||
![]() |
425517eecb | ||
![]() |
bc89c2902b | ||
![]() |
1497633924 | ||
![]() |
f167511753 | ||
![]() |
8c00647982 | ||
![]() |
e40d01f45d | ||
![]() |
51d1e79cc1 | ||
![]() |
807d85400c | ||
![]() |
5c1e9d3722 | ||
![]() |
b56e9beeb8 | ||
![]() |
d8be5bda1b | ||
![]() |
1cd5797f8e | ||
![]() |
35a7b73590 |
4
configure
vendored
4
configure
vendored
@ -2878,7 +2878,9 @@ probe_cc(){
|
||||
unset _depflags _DEPCMD _DEPFLAGS
|
||||
_flags_filter=echo
|
||||
|
||||
if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
|
||||
if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
|
||||
true # no-op to avoid reading stdin in following checks
|
||||
elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
|
||||
_type=llvm_gcc
|
||||
gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
|
||||
_ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
|
||||
|
@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER =
|
||||
PROJECT_NUMBER = 2.1.1
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
@ -6422,9 +6422,11 @@ The main purpose of setting @option{mp} to a chroma plane is to reduce CPU
|
||||
load and make pullup usable in realtime on slow machines.
|
||||
@end table
|
||||
|
||||
For example to inverse telecined NTSC input:
|
||||
For best results (without duplicated frames in the output file) it is
|
||||
necessary to change the output frame rate. For example, to inverse
|
||||
telecine NTSC input:
|
||||
@example
|
||||
pullup,fps=24000/1001
|
||||
ffmpeg -i input -vf pullup -r 24000/1001 ...
|
||||
@end example
|
||||
|
||||
@section removelogo
|
||||
|
17
ffmpeg.c
17
ffmpeg.c
@ -817,10 +817,23 @@ static void do_video_out(AVFormatContext *s,
|
||||
nb_frames = 1;
|
||||
|
||||
format_video_sync = video_sync_method;
|
||||
if (format_video_sync == VSYNC_AUTO)
|
||||
if (format_video_sync == VSYNC_AUTO) {
|
||||
format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : VSYNC_CFR;
|
||||
if ( ist
|
||||
&& format_video_sync == VSYNC_CFR
|
||||
&& input_files[ist->file_index]->ctx->nb_streams == 1
|
||||
&& input_files[ist->file_index]->input_ts_offset == 0) {
|
||||
format_video_sync = VSYNC_VSCFR;
|
||||
}
|
||||
}
|
||||
|
||||
switch (format_video_sync) {
|
||||
case VSYNC_VSCFR:
|
||||
if (ost->frame_number == 0 && delta - duration >= 0.5) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta - duration));
|
||||
delta = duration;
|
||||
ost->sync_opts = lrint(sync_ipts);
|
||||
}
|
||||
case VSYNC_CFR:
|
||||
// FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
|
||||
if (delta < -1.1)
|
||||
@ -2357,7 +2370,7 @@ static int transcode_init(void)
|
||||
if (ost->filter && !(codec->time_base.num && codec->time_base.den))
|
||||
codec->time_base = ost->filter->filter->inputs[0]->time_base;
|
||||
if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
|
||||
&& (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
|
||||
&& (video_sync_method == VSYNC_CFR || video_sync_method == VSYNC_VSCFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
|
||||
av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
|
||||
"Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
|
||||
}
|
||||
|
2
ffmpeg.h
2
ffmpeg.h
@ -51,6 +51,7 @@
|
||||
#define VSYNC_PASSTHROUGH 0
|
||||
#define VSYNC_CFR 1
|
||||
#define VSYNC_VFR 2
|
||||
#define VSYNC_VSCFR 0xfe
|
||||
#define VSYNC_DROP 0xff
|
||||
|
||||
#define MAX_STREAMS 1024 /* arbitrary sanity check value */
|
||||
@ -281,6 +282,7 @@ typedef struct InputFile {
|
||||
int eof_reached; /* true if eof reached */
|
||||
int eagain; /* true if last read attempt returned EAGAIN */
|
||||
int ist_index; /* index of first stream in input_streams */
|
||||
int64_t input_ts_offset;
|
||||
int64_t ts_offset;
|
||||
int64_t last_ts;
|
||||
int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
|
||||
|
@ -852,6 +852,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
f->ist_index = nb_input_streams - ic->nb_streams;
|
||||
f->start_time = o->start_time;
|
||||
f->recording_time = o->recording_time;
|
||||
f->input_ts_offset = o->input_ts_offset;
|
||||
f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
|
||||
f->nb_streams = ic->nb_streams;
|
||||
f->rate_emu = o->rate_emu;
|
||||
|
@ -120,6 +120,7 @@ typedef struct BinkContext {
|
||||
int version; ///< internal Bink file version
|
||||
int has_alpha;
|
||||
int swap_planes;
|
||||
unsigned frame_num;
|
||||
|
||||
Bundle bundle[BINKB_NB_SRC]; ///< bundles for decoding all data types
|
||||
Tree col_high[16]; ///< trees for decoding high nibble in "colours" data type
|
||||
@ -1206,6 +1207,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac
|
||||
if (c->version >= 'i')
|
||||
skip_bits_long(&gb, 32);
|
||||
|
||||
c->frame_num++;
|
||||
|
||||
for (plane = 0; plane < 3; plane++) {
|
||||
plane_idx = (!plane || !c->swap_planes) ? plane : (plane ^ 3);
|
||||
|
||||
@ -1214,7 +1217,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac
|
||||
return ret;
|
||||
} else {
|
||||
if ((ret = binkb_decode_plane(c, frame, &gb, plane_idx,
|
||||
!avctx->frame_number, !!plane)) < 0)
|
||||
c->frame_num == 1, !!plane)) < 0)
|
||||
return ret;
|
||||
}
|
||||
if (get_bits_count(&gb) >= bits_count)
|
||||
@ -1332,6 +1335,13 @@ static av_cold int decode_end(AVCodecContext *avctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void flush(AVCodecContext *avctx)
|
||||
{
|
||||
BinkContext * const c = avctx->priv_data;
|
||||
|
||||
c->frame_num = 0;
|
||||
}
|
||||
|
||||
AVCodec ff_bink_decoder = {
|
||||
.name = "binkvideo",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Bink video"),
|
||||
@ -1341,5 +1351,6 @@ AVCodec ff_bink_decoder = {
|
||||
.init = decode_init,
|
||||
.close = decode_end,
|
||||
.decode = decode_frame,
|
||||
.flush = flush,
|
||||
.capabilities = CODEC_CAP_DR1,
|
||||
};
|
||||
|
@ -49,7 +49,10 @@ static void refill(CABACContext *c){
|
||||
c->low+= c->bytestream[0]<<1;
|
||||
#endif
|
||||
c->low -= CABAC_MASK;
|
||||
c->bytestream += CABAC_BITS / 8;
|
||||
#if !UNCHECKED_BITSTREAM_READER
|
||||
if (c->bytestream < c->bytestream_end)
|
||||
#endif
|
||||
c->bytestream += CABAC_BITS / 8;
|
||||
}
|
||||
|
||||
static inline void renorm_cabac_decoder_once(CABACContext *c){
|
||||
@ -76,7 +79,10 @@ static void refill2(CABACContext *c){
|
||||
#endif
|
||||
|
||||
c->low += x<<i;
|
||||
c->bytestream += CABAC_BITS/8;
|
||||
#if !UNCHECKED_BITSTREAM_READER
|
||||
if (c->bytestream < c->bytestream_end)
|
||||
#endif
|
||||
c->bytestream += CABAC_BITS/8;
|
||||
}
|
||||
|
||||
static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const state){
|
||||
|
@ -771,6 +771,10 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
||||
s->colorspace = 1;
|
||||
s->chroma_planes = 1;
|
||||
s->version = FFMAX(s->version, 1);
|
||||
if (!s->ac) {
|
||||
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
|
||||
return AVERROR(ENOSYS);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "format not supported\n");
|
||||
|
@ -3595,7 +3595,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
||||
} else {
|
||||
/* Shorten frame num gaps so we don't have to allocate reference
|
||||
* frames just to throw them away */
|
||||
if (h->frame_num != h->prev_frame_num && h->prev_frame_num >= 0) {
|
||||
if (h->frame_num != h->prev_frame_num) {
|
||||
int unwrap_prev_frame_num = h->prev_frame_num;
|
||||
int max_frame_num = 1 << h->sps.log2_max_frame_num;
|
||||
|
||||
@ -3668,7 +3668,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
||||
}
|
||||
}
|
||||
|
||||
while (h->frame_num != h->prev_frame_num && h->prev_frame_num >= 0 && !h0->first_field &&
|
||||
while (h->frame_num != h->prev_frame_num && !h0->first_field &&
|
||||
h->frame_num != (h->prev_frame_num + 1) % (1 << h->sps.log2_max_frame_num)) {
|
||||
Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
|
||||
av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
|
||||
|
@ -148,6 +148,8 @@ static inline int ls_get_code_runterm(GetBitContext *gb, JLSState *state,
|
||||
ret = ret >> 1;
|
||||
}
|
||||
|
||||
if(FFABS(ret) > 0xFFFF)
|
||||
return -0x10000;
|
||||
/* update state */
|
||||
state->A[Q] += FFABS(ret) - RItype;
|
||||
ret *= state->twonear;
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/lls.h"
|
||||
#include "libavutil/lls2.h"
|
||||
|
||||
#define LPC_USE_DOUBLE
|
||||
#include "lpc.h"
|
||||
@ -208,7 +208,7 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
||||
}
|
||||
|
||||
if (lpc_type == FF_LPC_TYPE_CHOLESKY) {
|
||||
LLSModel m[2];
|
||||
LLSModel2 m[2];
|
||||
LOCAL_ALIGNED(32, double, var, [FFALIGN(MAX_LPC_ORDER+1,4)]);
|
||||
double av_uninit(weight);
|
||||
memset(var, 0, FFALIGN(MAX_LPC_ORDER+1,4)*sizeof(*var));
|
||||
@ -217,7 +217,7 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
||||
m[0].coeff[max_order-1][j] = -lpc[max_order-1][j];
|
||||
|
||||
for(; pass<lpc_passes; pass++){
|
||||
avpriv_init_lls(&m[pass&1], max_order);
|
||||
avpriv_init_lls2(&m[pass&1], max_order);
|
||||
|
||||
weight=0;
|
||||
for(i=max_order; i<blocksize; i++){
|
||||
@ -238,7 +238,7 @@ int ff_lpc_calc_coefs(LPCContext *s,
|
||||
|
||||
m[pass&1].update_lls(&m[pass&1], var);
|
||||
}
|
||||
avpriv_solve_lls(&m[pass&1], 0.001, 0);
|
||||
avpriv_solve_lls2(&m[pass&1], 0.001, 0);
|
||||
}
|
||||
|
||||
for(i=0; i<max_order; i++){
|
||||
|
@ -2070,7 +2070,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
|
||||
if (s->codec_tag == AV_RL32("BW10")) {
|
||||
s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
|
||||
} else {
|
||||
exchange_uv(s); // common init reset pblocks, so we swap them here
|
||||
s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
|
||||
s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
|
||||
}
|
||||
|
@ -537,6 +537,15 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void exchange_uv(MpegEncContext *s)
|
||||
{
|
||||
int16_t (*tmp)[64];
|
||||
|
||||
tmp = s->pblocks[4];
|
||||
s->pblocks[4] = s->pblocks[5];
|
||||
s->pblocks[5] = tmp;
|
||||
}
|
||||
|
||||
static int init_duplicate_context(MpegEncContext *s)
|
||||
{
|
||||
int y_size = s->b8_stride * (2 * s->mb_height + 1);
|
||||
@ -567,6 +576,8 @@ static int init_duplicate_context(MpegEncContext *s)
|
||||
for (i = 0; i < 12; i++) {
|
||||
s->pblocks[i] = &s->block[i];
|
||||
}
|
||||
if (s->avctx->codec_tag == AV_RL32("VCR2"))
|
||||
exchange_uv(s);
|
||||
|
||||
if (s->out_format == FMT_H263) {
|
||||
/* ac values */
|
||||
@ -641,6 +652,8 @@ int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
|
||||
for (i = 0; i < 12; i++) {
|
||||
dst->pblocks[i] = &dst->block[i];
|
||||
}
|
||||
if (dst->avctx->codec_tag == AV_RL32("VCR2"))
|
||||
exchange_uv(dst);
|
||||
if (!dst->edge_emu_buffer &&
|
||||
(ret = ff_mpv_frame_size_alloc(dst, dst->linesize)) < 0) {
|
||||
av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
|
||||
|
@ -173,6 +173,17 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src,
|
||||
#endif
|
||||
return dst16;
|
||||
case 20:
|
||||
if (avctx->channels == 1) {
|
||||
do {
|
||||
for (i = 2; i; i--) {
|
||||
dst32[0] = bytestream2_get_be16u(&gb) << 16;
|
||||
dst32[1] = bytestream2_get_be16u(&gb) << 16;
|
||||
t = bytestream2_get_byteu(&gb);
|
||||
*dst32++ += (t & 0xf0) << 8;
|
||||
*dst32++ += (t & 0x0f) << 12;
|
||||
}
|
||||
} while (--blocks);
|
||||
} else {
|
||||
do {
|
||||
for (i = s->groups_per_block; i; i--) {
|
||||
dst32[0] = bytestream2_get_be16u(&gb) << 16;
|
||||
@ -180,15 +191,26 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src,
|
||||
dst32[2] = bytestream2_get_be16u(&gb) << 16;
|
||||
dst32[3] = bytestream2_get_be16u(&gb) << 16;
|
||||
t = bytestream2_get_byteu(&gb);
|
||||
*dst32 += (t & 0xf0) << 8;
|
||||
*dst32 += (t & 0x0f) << 12;
|
||||
*dst32++ += (t & 0xf0) << 8;
|
||||
*dst32++ += (t & 0x0f) << 12;
|
||||
t = bytestream2_get_byteu(&gb);
|
||||
*dst32 += (t & 0xf0) << 8;
|
||||
*dst32 += (t & 0x0f) << 12;
|
||||
*dst32++ += (t & 0xf0) << 8;
|
||||
*dst32++ += (t & 0x0f) << 12;
|
||||
}
|
||||
} while (--blocks);
|
||||
}
|
||||
return dst32;
|
||||
case 24:
|
||||
if (avctx->channels == 1) {
|
||||
do {
|
||||
for (i = 2; i; i--) {
|
||||
dst32[0] = bytestream2_get_be16u(&gb) << 16;
|
||||
dst32[1] = bytestream2_get_be16u(&gb) << 16;
|
||||
*dst32++ += bytestream2_get_byteu(&gb) << 8;
|
||||
*dst32++ += bytestream2_get_byteu(&gb) << 8;
|
||||
}
|
||||
} while (--blocks);
|
||||
} else {
|
||||
do {
|
||||
for (i = s->groups_per_block; i; i--) {
|
||||
dst32[0] = bytestream2_get_be16u(&gb) << 16;
|
||||
@ -201,6 +223,7 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src,
|
||||
*dst32++ += bytestream2_get_byteu(&gb) << 8;
|
||||
}
|
||||
} while (--blocks);
|
||||
}
|
||||
return dst32;
|
||||
default:
|
||||
return NULL;
|
||||
|
@ -219,7 +219,7 @@ int ff_tadd_bytes_metadata(int count, const char *name, const char *sep,
|
||||
char *ap;
|
||||
int i;
|
||||
|
||||
if (count >= INT_MAX / sizeof(int8_t) || count <= 0)
|
||||
if (count >= INT_MAX / sizeof(int8_t) || count < 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
if (bytestream2_get_bytes_left(gb) < count * sizeof(int8_t))
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 55
|
||||
#define LIBAVCODEC_VERSION_MINOR 39
|
||||
#define LIBAVCODEC_VERSION_MICRO 100
|
||||
#define LIBAVCODEC_VERSION_MICRO 101
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||
LIBAVCODEC_VERSION_MINOR, \
|
||||
|
@ -36,6 +36,18 @@
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
||||
#ifndef UNCHECKED_BITSTREAM_READER
|
||||
#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
|
||||
#endif
|
||||
|
||||
#if UNCHECKED_BITSTREAM_READER
|
||||
#define END_CHECK(end) ""
|
||||
#else
|
||||
#define END_CHECK(end) \
|
||||
"cmp "end" , %%"REG_c" \n\t"\
|
||||
"jge 1f \n\t"
|
||||
#endif
|
||||
|
||||
#ifdef BROKEN_RELOCATIONS
|
||||
#define TABLES_ARG , "r"(tables)
|
||||
|
||||
@ -80,7 +92,9 @@
|
||||
"test "lowword" , "lowword" \n\t"\
|
||||
"jnz 2f \n\t"\
|
||||
"mov "byte" , %%"REG_c" \n\t"\
|
||||
END_CHECK(end)\
|
||||
"add"OPSIZE" $2 , "byte" \n\t"\
|
||||
"1: \n\t"\
|
||||
"movzwl (%%"REG_c") , "tmp" \n\t"\
|
||||
"lea -1("low") , %%ecx \n\t"\
|
||||
"xor "low" , %%ecx \n\t"\
|
||||
@ -139,7 +153,9 @@
|
||||
"test "lowword" , "lowword" \n\t"\
|
||||
" jnz 2f \n\t"\
|
||||
"mov "byte" , %%"REG_c" \n\t"\
|
||||
END_CHECK(end)\
|
||||
"add"OPSIZE" $2 , "byte" \n\t"\
|
||||
"1: \n\t"\
|
||||
"movzwl (%%"REG_c") , "tmp" \n\t"\
|
||||
"lea -1("low") , %%ecx \n\t"\
|
||||
"xor "low" , %%ecx \n\t"\
|
||||
@ -214,9 +230,16 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val)
|
||||
"movzwl (%1), %%edx \n\t"
|
||||
"bswap %%edx \n\t"
|
||||
"shrl $15, %%edx \n\t"
|
||||
#if UNCHECKED_BITSTREAM_READER
|
||||
"add $2, %1 \n\t"
|
||||
"addl %%edx, %%eax \n\t"
|
||||
"mov %1, %c4(%2) \n\t"
|
||||
#else
|
||||
"addl %%edx, %%eax \n\t"
|
||||
"cmp %c5(%2), %1 \n\t"
|
||||
"jge 1f \n\t"
|
||||
"add"OPSIZE" $2, %c4(%2) \n\t"
|
||||
#endif
|
||||
"1: \n\t"
|
||||
"movl %%eax, %c3(%2) \n\t"
|
||||
|
||||
|
@ -95,7 +95,7 @@ static const AVOption options[] = {
|
||||
{"multiple_requests", "use persistent connections", OFFSET(multiple_requests), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D|E },
|
||||
{"post_data", "set custom HTTP post data", OFFSET(post_data), AV_OPT_TYPE_BINARY, .flags = D|E },
|
||||
{"mime_type", "set MIME type", OFFSET(mime_type), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
|
||||
{"cookies", "set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax", OFFSET(cookies), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
|
||||
{"cookies", "set cookies to be sent in applicable future requests, use newline delimited Set-Cookie HTTP field value syntax", OFFSET(cookies), AV_OPT_TYPE_STRING, {0}, 0, 0, D },
|
||||
{"icy", "request ICY metadata", OFFSET(icy), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D },
|
||||
{"icy_metadata_headers", "return ICY metadata headers", OFFSET(icy_metadata_headers), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
|
||||
{"icy_metadata_packet", "return current ICY metadata packet", OFFSET(icy_metadata_packet), AV_OPT_TYPE_STRING, {0}, 0, 0, 0 },
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/avstring.h"
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/opt.h"
|
||||
@ -37,6 +38,7 @@ typedef struct {
|
||||
char path[1024];
|
||||
int update;
|
||||
int use_strftime;
|
||||
const char *muxer;
|
||||
} VideoMuxData;
|
||||
|
||||
static int write_header(AVFormatContext *s)
|
||||
@ -44,7 +46,6 @@ static int write_header(AVFormatContext *s)
|
||||
VideoMuxData *img = s->priv_data;
|
||||
AVStream *st = s->streams[0];
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(st->codec->pix_fmt);
|
||||
const char *str;
|
||||
|
||||
av_strlcpy(img->path, s->filename, sizeof(img->path));
|
||||
|
||||
@ -54,14 +55,18 @@ static int write_header(AVFormatContext *s)
|
||||
else
|
||||
img->is_pipe = 1;
|
||||
|
||||
str = strrchr(img->path, '.');
|
||||
if (st->codec->codec_id == AV_CODEC_ID_GIF) {
|
||||
img->muxer = "gif";
|
||||
} else if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
|
||||
const char *str = strrchr(img->path, '.');
|
||||
/* TODO: reindent */
|
||||
img->split_planes = str
|
||||
&& !av_strcasecmp(str + 1, "y")
|
||||
&& s->nb_streams == 1
|
||||
&& st->codec->codec_id == AV_CODEC_ID_RAWVIDEO
|
||||
&& desc
|
||||
&&(desc->flags & AV_PIX_FMT_FLAG_PLANAR)
|
||||
&& desc->nb_components >= 3;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -124,6 +129,37 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
avio_write(pb[3], pkt->data + ysize + 2*usize, ysize);
|
||||
avio_close(pb[3]);
|
||||
}
|
||||
} else if (img->muxer) {
|
||||
int ret;
|
||||
AVStream *st;
|
||||
AVPacket pkt2 = {0};
|
||||
AVFormatContext *fmt = NULL;
|
||||
|
||||
av_assert0(!img->split_planes);
|
||||
|
||||
ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->filename);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
st = avformat_new_stream(fmt, NULL);
|
||||
if (!st) {
|
||||
avformat_free_context(fmt);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
st->id = pkt->stream_index;
|
||||
|
||||
fmt->pb = pb[0];
|
||||
if ((ret = av_copy_packet(&pkt2, pkt)) < 0 ||
|
||||
(ret = av_dup_packet(&pkt2)) < 0 ||
|
||||
(ret = avcodec_copy_context(st->codec, s->streams[0]->codec)) < 0 ||
|
||||
(ret = avformat_write_header(fmt, NULL)) < 0 ||
|
||||
(ret = av_interleaved_write_frame(fmt, &pkt2)) < 0 ||
|
||||
(ret = av_write_trailer(fmt)) < 0) {
|
||||
av_free_packet(&pkt2);
|
||||
avformat_free_context(fmt);
|
||||
return ret;
|
||||
}
|
||||
av_free_packet(&pkt2);
|
||||
avformat_free_context(fmt);
|
||||
} else {
|
||||
avio_write(pb[0], pkt->data, pkt->size);
|
||||
}
|
||||
|
@ -1976,7 +1976,9 @@ static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, co
|
||||
/* check packet sync byte */
|
||||
if ((*data)[0] != 0x47) {
|
||||
/* find a new packet start */
|
||||
avio_seek(pb, -raw_packet_size, SEEK_CUR);
|
||||
uint64_t pos = avio_tell(pb);
|
||||
avio_seek(pb, -FFMIN(raw_packet_size, pos), SEEK_CUR);
|
||||
|
||||
if (mpegts_resync(s) < 0)
|
||||
return AVERROR(EAGAIN);
|
||||
else
|
||||
|
@ -57,7 +57,7 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
|
||||
break;
|
||||
case IEC61937_MPEG2_AAC:
|
||||
init_get_bits(&gbc, buf, AAC_ADTS_HEADER_SIZE * 8);
|
||||
if (avpriv_aac_parse_header(&gbc, &aac_hdr)) {
|
||||
if (avpriv_aac_parse_header(&gbc, &aac_hdr) < 0) {
|
||||
if (s) /* be silent during a probe */
|
||||
av_log(s, AV_LOG_ERROR, "Invalid AAC packet in IEC 61937\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
@ -26,15 +26,15 @@
|
||||
|
||||
typedef struct ThpDemuxContext {
|
||||
int version;
|
||||
int first_frame;
|
||||
int first_framesz;
|
||||
int last_frame;
|
||||
unsigned first_frame;
|
||||
unsigned first_framesz;
|
||||
unsigned last_frame;
|
||||
int compoff;
|
||||
int framecnt;
|
||||
unsigned framecnt;
|
||||
AVRational fps;
|
||||
int frame;
|
||||
int next_frame;
|
||||
int next_framesz;
|
||||
unsigned frame;
|
||||
int64_t next_frame;
|
||||
unsigned next_framesz;
|
||||
int video_stream_index;
|
||||
int audio_stream_index;
|
||||
int compcount;
|
||||
@ -158,7 +158,7 @@ static int thp_read_packet(AVFormatContext *s,
|
||||
avio_seek(pb, thp->next_frame, SEEK_SET);
|
||||
|
||||
/* Locate the next frame and read out its size. */
|
||||
thp->next_frame += thp->next_framesz;
|
||||
thp->next_frame += FFMAX(thp->next_framesz, 1);
|
||||
thp->next_framesz = avio_rb32(pb);
|
||||
|
||||
avio_rb32(pb); /* Previous total size. */
|
||||
|
@ -1039,7 +1039,8 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
|
||||
if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
|
||||
pkt->dts= AV_NOPTS_VALUE;
|
||||
|
||||
if (st->codec->codec_id != AV_CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
|
||||
if (pc && pc->pict_type == AV_PICTURE_TYPE_B
|
||||
&& !st->codec->has_b_frames)
|
||||
//FIXME Set low_delay = 0 when has_b_frames = 1
|
||||
st->codec->has_b_frames = 1;
|
||||
|
||||
@ -2863,9 +2864,10 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
goto find_stream_info_err;
|
||||
}
|
||||
|
||||
read_size += pkt->size;
|
||||
|
||||
st = ic->streams[pkt->stream_index];
|
||||
if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
|
||||
read_size += pkt->size;
|
||||
|
||||
if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
|
||||
/* check for non-increasing dts */
|
||||
if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
|
||||
|
@ -90,7 +90,8 @@ OBJS = adler32.o \
|
||||
intfloat_readwrite.o \
|
||||
intmath.o \
|
||||
lfg.o \
|
||||
lls.o \
|
||||
lls1.o \
|
||||
lls2.o \
|
||||
log.o \
|
||||
log2_tab.o \
|
||||
mathematics.o \
|
||||
@ -143,7 +144,8 @@ TESTPROGS = adler32 \
|
||||
fifo \
|
||||
hmac \
|
||||
lfg \
|
||||
lls \
|
||||
lls1 \
|
||||
lls2 \
|
||||
md5 \
|
||||
murmur3 \
|
||||
opt \
|
||||
|
@ -30,14 +30,23 @@
|
||||
|
||||
#include "attributes.h"
|
||||
#include "version.h"
|
||||
#include "lls.h"
|
||||
#include "lls1.h"
|
||||
|
||||
static void update_lls(LLSModel *m, double *var)
|
||||
#if FF_API_LLS1
|
||||
|
||||
av_cold void avpriv_init_lls(LLSModel *m, int indep_count)
|
||||
{
|
||||
memset(m, 0, sizeof(LLSModel));
|
||||
m->indep_count = indep_count;
|
||||
}
|
||||
|
||||
void avpriv_update_lls(LLSModel *m, double *var, double decay)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i <= m->indep_count; i++) {
|
||||
for (j = i; j <= m->indep_count; j++) {
|
||||
m->covariance[i][j] *= decay;
|
||||
m->covariance[i][j] += var[i] * var[j];
|
||||
}
|
||||
}
|
||||
@ -46,8 +55,8 @@ static void update_lls(LLSModel *m, double *var)
|
||||
void avpriv_solve_lls(LLSModel *m, double threshold, unsigned short min_order)
|
||||
{
|
||||
int i, j, k;
|
||||
double (*factor)[MAX_VARS_ALIGN] = (void *) &m->covariance[1][0];
|
||||
double (*covar) [MAX_VARS_ALIGN] = (void *) &m->covariance[1][1];
|
||||
double (*factor)[MAX_VARS + 1] = (void *) &m->covariance[1][0];
|
||||
double (*covar) [MAX_VARS + 1] = (void *) &m->covariance[1][1];
|
||||
double *covar_y = m->covariance[0];
|
||||
int count = m->indep_count;
|
||||
|
||||
@ -100,7 +109,7 @@ void avpriv_solve_lls(LLSModel *m, double threshold, unsigned short min_order)
|
||||
}
|
||||
}
|
||||
|
||||
static double evaluate_lls(LLSModel *m, double *param, int order)
|
||||
double avpriv_evaluate_lls(LLSModel *m, double *param, int order)
|
||||
{
|
||||
int i;
|
||||
double out = 0;
|
||||
@ -111,16 +120,6 @@ static double evaluate_lls(LLSModel *m, double *param, int order)
|
||||
return out;
|
||||
}
|
||||
|
||||
av_cold void avpriv_init_lls(LLSModel *m, int indep_count)
|
||||
{
|
||||
memset(m, 0, sizeof(LLSModel));
|
||||
m->indep_count = indep_count;
|
||||
m->update_lls = update_lls;
|
||||
m->evaluate_lls = evaluate_lls;
|
||||
if (ARCH_X86)
|
||||
ff_init_lls_x86(m);
|
||||
}
|
||||
|
||||
#if FF_API_LLS_PRIVATE
|
||||
av_cold void av_init_lls(LLSModel *m, int indep_count)
|
||||
{
|
||||
@ -128,7 +127,7 @@ av_cold void av_init_lls(LLSModel *m, int indep_count)
|
||||
}
|
||||
void av_update_lls(LLSModel *m, double *param, double decay)
|
||||
{
|
||||
m->update_lls(m, param);
|
||||
avpriv_update_lls(m, param, decay);
|
||||
}
|
||||
void av_solve_lls(LLSModel *m, double threshold, int min_order)
|
||||
{
|
||||
@ -136,10 +135,12 @@ void av_solve_lls(LLSModel *m, double threshold, int min_order)
|
||||
}
|
||||
double av_evaluate_lls(LLSModel *m, double *param, int order)
|
||||
{
|
||||
return m->evaluate_lls(m, param, order);
|
||||
return avpriv_evaluate_lls(m, param, order);
|
||||
}
|
||||
#endif /* FF_API_LLS_PRIVATE */
|
||||
|
||||
#endif /* FF_API_LLS1 */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
@ -156,17 +157,17 @@ int main(void)
|
||||
avpriv_init_lls(&m, 3);
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
LOCAL_ALIGNED(32, double, var, [4]);
|
||||
double var[4];
|
||||
double eval;
|
||||
|
||||
var[0] = (av_lfg_get(&lfg) / (double) UINT_MAX - 0.5) * 2;
|
||||
var[1] = var[0] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
var[2] = var[1] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
var[3] = var[2] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
m.update_lls(&m, var);
|
||||
avpriv_update_lls(&m, var, 0.99);
|
||||
avpriv_solve_lls(&m, 0.001, 0);
|
||||
for (order = 0; order < 3; order++) {
|
||||
eval = m.evaluate_lls(&m, var + 1, order);
|
||||
eval = avpriv_evaluate_lls(&m, var + 1, order);
|
||||
printf("real:%9f order:%d pred:%9f var:%f coeffs:%f %9f %9f\n",
|
||||
var[0], order, eval, sqrt(m.variance[order] / (i + 1)),
|
||||
m.coeff[order][0], m.coeff[order][1],
|
54
libavutil/lls1.h
Normal file
54
libavutil/lls1.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* linear least squares model
|
||||
*
|
||||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVUTIL_LLS_H
|
||||
#define AVUTIL_LLS_H
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#define MAX_VARS 32
|
||||
|
||||
//FIXME avoid direct access to LLSModel from outside
|
||||
|
||||
/**
|
||||
* Linear least squares model.
|
||||
*/
|
||||
typedef struct LLSModel {
|
||||
double covariance[MAX_VARS + 1][MAX_VARS + 1];
|
||||
double coeff[MAX_VARS][MAX_VARS];
|
||||
double variance[MAX_VARS];
|
||||
int indep_count;
|
||||
} LLSModel;
|
||||
|
||||
void avpriv_init_lls(LLSModel *m, int indep_count);
|
||||
void avpriv_update_lls(LLSModel *m, double *param, double decay);
|
||||
void avpriv_solve_lls(LLSModel *m, double threshold, unsigned short min_order);
|
||||
double avpriv_evaluate_lls(LLSModel *m, double *param, int order);
|
||||
|
||||
#if FF_API_LLS_PRIVATE
|
||||
void av_init_lls(LLSModel *m, int indep_count);
|
||||
void av_update_lls(LLSModel *m, double *param, double decay);
|
||||
void av_solve_lls(LLSModel *m, double threshold, int min_order);
|
||||
double av_evaluate_lls(LLSModel *m, double *param, int order);
|
||||
#endif /* FF_API_LLS_PRIVATE */
|
||||
|
||||
#endif /* AVUTIL_LLS_H */
|
160
libavutil/lls2.c
Normal file
160
libavutil/lls2.c
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* linear least squares model
|
||||
*
|
||||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* linear least squares model
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "attributes.h"
|
||||
#include "version.h"
|
||||
#include "lls2.h"
|
||||
|
||||
static void update_lls(LLSModel2 *m, double *var)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i <= m->indep_count; i++) {
|
||||
for (j = i; j <= m->indep_count; j++) {
|
||||
m->covariance[i][j] += var[i] * var[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void avpriv_solve_lls2(LLSModel2 *m, double threshold, unsigned short min_order)
|
||||
{
|
||||
int i, j, k;
|
||||
double (*factor)[MAX_VARS_ALIGN] = (void *) &m->covariance[1][0];
|
||||
double (*covar) [MAX_VARS_ALIGN] = (void *) &m->covariance[1][1];
|
||||
double *covar_y = m->covariance[0];
|
||||
int count = m->indep_count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
for (j = i; j < count; j++) {
|
||||
double sum = covar[i][j];
|
||||
|
||||
for (k = i - 1; k >= 0; k--)
|
||||
sum -= factor[i][k] * factor[j][k];
|
||||
|
||||
if (i == j) {
|
||||
if (sum < threshold)
|
||||
sum = 1.0;
|
||||
factor[i][i] = sqrt(sum);
|
||||
} else {
|
||||
factor[j][i] = sum / factor[i][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
double sum = covar_y[i + 1];
|
||||
|
||||
for (k = i - 1; k >= 0; k--)
|
||||
sum -= factor[i][k] * m->coeff[0][k];
|
||||
|
||||
m->coeff[0][i] = sum / factor[i][i];
|
||||
}
|
||||
|
||||
for (j = count - 1; j >= min_order; j--) {
|
||||
for (i = j; i >= 0; i--) {
|
||||
double sum = m->coeff[0][i];
|
||||
|
||||
for (k = i + 1; k <= j; k++)
|
||||
sum -= factor[k][i] * m->coeff[j][k];
|
||||
|
||||
m->coeff[j][i] = sum / factor[i][i];
|
||||
}
|
||||
|
||||
m->variance[j] = covar_y[0];
|
||||
|
||||
for (i = 0; i <= j; i++) {
|
||||
double sum = m->coeff[j][i] * covar[i][i] - 2 * covar_y[i + 1];
|
||||
|
||||
for (k = 0; k < i; k++)
|
||||
sum += 2 * m->coeff[j][k] * covar[k][i];
|
||||
|
||||
m->variance[j] += m->coeff[j][i] * sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static double evaluate_lls(LLSModel2 *m, double *param, int order)
|
||||
{
|
||||
int i;
|
||||
double out = 0;
|
||||
|
||||
for (i = 0; i <= order; i++)
|
||||
out += param[i] * m->coeff[order][i];
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
av_cold void avpriv_init_lls2(LLSModel2 *m, int indep_count)
|
||||
{
|
||||
memset(m, 0, sizeof(LLSModel2));
|
||||
m->indep_count = indep_count;
|
||||
m->update_lls = update_lls;
|
||||
m->evaluate_lls = evaluate_lls;
|
||||
if (ARCH_X86)
|
||||
ff_init_lls_x86(m);
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include "lfg.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
LLSModel2 m;
|
||||
int i, order;
|
||||
AVLFG lfg;
|
||||
|
||||
av_lfg_init(&lfg, 1);
|
||||
avpriv_init_lls2(&m, 3);
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
LOCAL_ALIGNED(32, double, var, [4]);
|
||||
double eval;
|
||||
|
||||
var[0] = (av_lfg_get(&lfg) / (double) UINT_MAX - 0.5) * 2;
|
||||
var[1] = var[0] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
var[2] = var[1] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
var[3] = var[2] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
|
||||
m.update_lls(&m, var);
|
||||
avpriv_solve_lls2(&m, 0.001, 0);
|
||||
for (order = 0; order < 3; order++) {
|
||||
eval = m.evaluate_lls(&m, var + 1, order);
|
||||
printf("real:%9f order:%d pred:%9f var:%f coeffs:%f %9f %9f\n",
|
||||
var[0], order, eval, sqrt(m.variance[order] / (i + 1)),
|
||||
m.coeff[order][0], m.coeff[order][1],
|
||||
m.coeff[order][2]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
@ -30,12 +30,12 @@
|
||||
#define MAX_VARS 32
|
||||
#define MAX_VARS_ALIGN FFALIGN(MAX_VARS+1,4)
|
||||
|
||||
//FIXME avoid direct access to LLSModel from outside
|
||||
//FIXME avoid direct access to LLSModel2 from outside
|
||||
|
||||
/**
|
||||
* Linear least squares model.
|
||||
*/
|
||||
typedef struct LLSModel {
|
||||
typedef struct LLSModel2 {
|
||||
DECLARE_ALIGNED(32, double, covariance[MAX_VARS_ALIGN][MAX_VARS_ALIGN]);
|
||||
DECLARE_ALIGNED(32, double, coeff[MAX_VARS][MAX_VARS]);
|
||||
double variance[MAX_VARS];
|
||||
@ -47,25 +47,18 @@ typedef struct LLSModel {
|
||||
* 32-byte aligned, and any padding elements must be initialized
|
||||
* (i.e not denormal/nan).
|
||||
*/
|
||||
void (*update_lls)(struct LLSModel *m, double *var);
|
||||
void (*update_lls)(struct LLSModel2 *m, double *var);
|
||||
/**
|
||||
* Inner product of var[] and the LPC coefs.
|
||||
* @param m this context
|
||||
* @param var training samples, excluding the value to be predicted. unaligned.
|
||||
* @param order lpc order
|
||||
*/
|
||||
double (*evaluate_lls)(struct LLSModel *m, double *var, int order);
|
||||
} LLSModel;
|
||||
double (*evaluate_lls)(struct LLSModel2 *m, double *var, int order);
|
||||
} LLSModel2;
|
||||
|
||||
void avpriv_init_lls(LLSModel *m, int indep_count);
|
||||
void ff_init_lls_x86(LLSModel *m);
|
||||
void avpriv_solve_lls(LLSModel *m, double threshold, unsigned short min_order);
|
||||
|
||||
#if FF_API_LLS_PRIVATE
|
||||
void av_init_lls(LLSModel *m, int indep_count);
|
||||
void av_update_lls(LLSModel *m, double *param, double decay);
|
||||
void av_solve_lls(LLSModel *m, double threshold, int min_order);
|
||||
double av_evaluate_lls(LLSModel *m, double *param, int order);
|
||||
#endif /* FF_API_LLS_PRIVATE */
|
||||
void avpriv_init_lls2(LLSModel2 *m, int indep_count);
|
||||
void ff_init_lls_x86(LLSModel2 *m);
|
||||
void avpriv_solve_lls2(LLSModel2 *m, double threshold, unsigned short min_order);
|
||||
|
||||
#endif /* AVUTIL_LLS_H */
|
@ -76,7 +76,7 @@
|
||||
|
||||
#define LIBAVUTIL_VERSION_MAJOR 52
|
||||
#define LIBAVUTIL_VERSION_MINOR 48
|
||||
#define LIBAVUTIL_VERSION_MICRO 100
|
||||
#define LIBAVUTIL_VERSION_MICRO 101
|
||||
|
||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||
LIBAVUTIL_VERSION_MINOR, \
|
||||
@ -132,6 +132,9 @@
|
||||
#ifndef FF_API_LLS_PRIVATE
|
||||
#define FF_API_LLS_PRIVATE (LIBAVUTIL_VERSION_MAJOR < 53)
|
||||
#endif
|
||||
#ifndef FF_API_LLS1
|
||||
#define FF_API_LLS1 (LIBAVUTIL_VERSION_MAJOR < 53)
|
||||
#endif
|
||||
#ifndef FF_API_AVFRAME_LAVC
|
||||
#define FF_API_AVFRAME_LAVC (LIBAVUTIL_VERSION_MAJOR < 53)
|
||||
#endif
|
||||
|
@ -29,7 +29,7 @@ SECTION .text
|
||||
%define COVAR_STRIDE MAX_VARS_ALIGN*8
|
||||
%define COVAR(x,y) [covarq + (x)*8 + (y)*COVAR_STRIDE]
|
||||
|
||||
struc LLSModel
|
||||
struc LLSModel2
|
||||
.covariance: resq MAX_VARS_ALIGN*MAX_VARS_ALIGN
|
||||
.coeff: resq MAX_VARS*MAX_VARS
|
||||
.variance: resq MAX_VARS
|
||||
@ -49,7 +49,7 @@ INIT_XMM sse2
|
||||
%define movdqa movaps
|
||||
cglobal update_lls, 2,5,8, ctx, var, i, j, covar2
|
||||
%define covarq ctxq
|
||||
mov id, [ctxq + LLSModel.indep_count]
|
||||
mov id, [ctxq + LLSModel2.indep_count]
|
||||
lea varq, [varq + iq*8]
|
||||
neg iq
|
||||
mov covar2q, covarq
|
||||
@ -129,7 +129,7 @@ cglobal update_lls, 2,5,8, ctx, var, i, j, covar2
|
||||
INIT_YMM avx
|
||||
cglobal update_lls, 3,6,8, ctx, var, count, i, j, count2
|
||||
%define covarq ctxq
|
||||
mov countd, [ctxq + LLSModel.indep_count]
|
||||
mov countd, [ctxq + LLSModel2.indep_count]
|
||||
lea count2d, [countq-2]
|
||||
xor id, id
|
||||
.loopi:
|
||||
@ -206,7 +206,7 @@ cglobal evaluate_lls, 3,4,2, ctx, var, order, i
|
||||
%define coefsq ctxq
|
||||
mov id, orderd
|
||||
imul orderd, MAX_VARS
|
||||
lea coefsq, [ctxq + LLSModel.coeff + orderq*8]
|
||||
lea coefsq, [ctxq + LLSModel2.coeff + orderq*8]
|
||||
movsd m0, [varq]
|
||||
movhpd m0, [varq + 8]
|
||||
mulpd m0, [coefsq]
|
||||
|
@ -20,14 +20,14 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "libavutil/lls.h"
|
||||
#include "libavutil/lls2.h"
|
||||
#include "libavutil/x86/cpu.h"
|
||||
|
||||
void ff_update_lls_sse2(LLSModel *m, double *var);
|
||||
void ff_update_lls_avx(LLSModel *m, double *var);
|
||||
double ff_evaluate_lls_sse2(LLSModel *m, double *var, int order);
|
||||
void ff_update_lls_sse2(LLSModel2 *m, double *var);
|
||||
void ff_update_lls_avx(LLSModel2 *m, double *var);
|
||||
double ff_evaluate_lls_sse2(LLSModel2 *m, double *var, int order);
|
||||
|
||||
av_cold void ff_init_lls_x86(LLSModel *m)
|
||||
av_cold void ff_init_lls_x86(LLSModel2 *m)
|
||||
{
|
||||
int cpu_flags = av_get_cpu_flags();
|
||||
if (EXTERNAL_SSE2(cpu_flags)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user