mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 20:19:55 +00:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: vf_drawtext: Replace FFmpeg by Libav in license boilerplate. mpegaudiodec: remove unusued code and variables improved 'edts' atom writing support mpegaudio: clean up compute_antialias() definition vp8: fix segmentation race during frame-threading. Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
f6a8ce98a7
@ -112,8 +112,6 @@ typedef struct MPADecodeContext {
|
|||||||
#include "mpegaudiodata.h"
|
#include "mpegaudiodata.h"
|
||||||
#include "mpegaudiodectab.h"
|
#include "mpegaudiodectab.h"
|
||||||
|
|
||||||
static void RENAME(compute_antialias)(MPADecodeContext *s, GranuleDef *g);
|
|
||||||
|
|
||||||
/* vlc structure for decoding layer 3 huffman tables */
|
/* vlc structure for decoding layer 3 huffman tables */
|
||||||
static VLC huff_vlc[16];
|
static VLC huff_vlc[16];
|
||||||
static VLC_TYPE huff_vlc_tables[
|
static VLC_TYPE huff_vlc_tables[
|
||||||
@ -135,8 +133,7 @@ static uint16_t band_index_long[9][23];
|
|||||||
/* intensity stereo coef table */
|
/* intensity stereo coef table */
|
||||||
static INTFLOAT is_table[2][16];
|
static INTFLOAT is_table[2][16];
|
||||||
static INTFLOAT is_table_lsf[2][2][16];
|
static INTFLOAT is_table_lsf[2][2][16];
|
||||||
static int32_t csa_table[8][4];
|
static INTFLOAT csa_table[8][4];
|
||||||
static float csa_table_float[8][4];
|
|
||||||
static INTFLOAT mdct_win[8][36];
|
static INTFLOAT mdct_win[8][36];
|
||||||
|
|
||||||
static int16_t division_tab3[1<<6 ];
|
static int16_t division_tab3[1<<6 ];
|
||||||
@ -272,27 +269,6 @@ static inline int l3_unscale(int value, int exponent)
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all integer n^(4/3) computation code */
|
|
||||||
#define DEV_ORDER 13
|
|
||||||
|
|
||||||
#define POW_FRAC_BITS 24
|
|
||||||
#define POW_FRAC_ONE (1 << POW_FRAC_BITS)
|
|
||||||
#define POW_FIX(a) ((int)((a) * POW_FRAC_ONE))
|
|
||||||
#define POW_MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> POW_FRAC_BITS)
|
|
||||||
|
|
||||||
static int dev_4_3_coefs[DEV_ORDER];
|
|
||||||
|
|
||||||
static av_cold void int_pow_init(void)
|
|
||||||
{
|
|
||||||
int i, a;
|
|
||||||
|
|
||||||
a = POW_FIX(1.0);
|
|
||||||
for(i=0;i<DEV_ORDER;i++) {
|
|
||||||
a = POW_MULL(a, POW_FIX(4.0 / 3.0) - i * POW_FIX(1.0)) / (i + 1);
|
|
||||||
dev_4_3_coefs[i] = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static av_cold int decode_init(AVCodecContext * avctx)
|
static av_cold int decode_init(AVCodecContext * avctx)
|
||||||
{
|
{
|
||||||
MPADecodeContext *s = avctx->priv_data;
|
MPADecodeContext *s = avctx->priv_data;
|
||||||
@ -388,7 +364,6 @@ static av_cold int decode_init(AVCodecContext * avctx)
|
|||||||
|
|
||||||
/* compute n ^ (4/3) and store it in mantissa/exp format */
|
/* compute n ^ (4/3) and store it in mantissa/exp format */
|
||||||
|
|
||||||
int_pow_init();
|
|
||||||
mpegaudio_tableinit();
|
mpegaudio_tableinit();
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
@ -441,14 +416,17 @@ static av_cold int decode_init(AVCodecContext * avctx)
|
|||||||
ci = ci_table[i];
|
ci = ci_table[i];
|
||||||
cs = 1.0 / sqrt(1.0 + ci * ci);
|
cs = 1.0 / sqrt(1.0 + ci * ci);
|
||||||
ca = cs * ci;
|
ca = cs * ci;
|
||||||
|
#if !CONFIG_FLOAT
|
||||||
csa_table[i][0] = FIXHR(cs/4);
|
csa_table[i][0] = FIXHR(cs/4);
|
||||||
csa_table[i][1] = FIXHR(ca/4);
|
csa_table[i][1] = FIXHR(ca/4);
|
||||||
csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4);
|
csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4);
|
||||||
csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4);
|
csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4);
|
||||||
csa_table_float[i][0] = cs;
|
#else
|
||||||
csa_table_float[i][1] = ca;
|
csa_table[i][0] = cs;
|
||||||
csa_table_float[i][2] = ca + cs;
|
csa_table[i][1] = ca;
|
||||||
csa_table_float[i][3] = ca - cs;
|
csa_table[i][2] = ca + cs;
|
||||||
|
csa_table[i][3] = ca - cs;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compute mdct windows */
|
/* compute mdct windows */
|
||||||
@ -1335,10 +1313,26 @@ static void compute_stereo(MPADecodeContext *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !CONFIG_FLOAT
|
#if CONFIG_FLOAT
|
||||||
static void compute_antialias_fixed(MPADecodeContext *s, GranuleDef *g)
|
#define AA(j) do { \
|
||||||
|
float tmp0 = ptr[-1-j]; \
|
||||||
|
float tmp1 = ptr[ j]; \
|
||||||
|
ptr[-1-j] = tmp0 * csa_table[j][0] - tmp1 * csa_table[j][1]; \
|
||||||
|
ptr[ j] = tmp0 * csa_table[j][1] + tmp1 * csa_table[j][0]; \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define AA(j) do { \
|
||||||
|
int tmp0 = ptr[-1-j]; \
|
||||||
|
int tmp1 = ptr[ j]; \
|
||||||
|
int tmp2 = MULH(tmp0 + tmp1, csa_table[j][0]); \
|
||||||
|
ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa_table[j][2])); \
|
||||||
|
ptr[ j] = 4*(tmp2 + MULH(tmp0, csa_table[j][3])); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void compute_antialias(MPADecodeContext *s, GranuleDef *g)
|
||||||
{
|
{
|
||||||
int32_t *ptr, *csa;
|
INTFLOAT *ptr;
|
||||||
int n, i;
|
int n, i;
|
||||||
|
|
||||||
/* we antialias only "long" bands */
|
/* we antialias only "long" bands */
|
||||||
@ -1353,28 +1347,18 @@ static void compute_antialias_fixed(MPADecodeContext *s, GranuleDef *g)
|
|||||||
|
|
||||||
ptr = g->sb_hybrid + 18;
|
ptr = g->sb_hybrid + 18;
|
||||||
for(i = n;i > 0;i--) {
|
for(i = n;i > 0;i--) {
|
||||||
int tmp0, tmp1, tmp2;
|
AA(0);
|
||||||
csa = &csa_table[0][0];
|
AA(1);
|
||||||
#define INT_AA(j) \
|
AA(2);
|
||||||
tmp0 = ptr[-1-j];\
|
AA(3);
|
||||||
tmp1 = ptr[ j];\
|
AA(4);
|
||||||
tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\
|
AA(5);
|
||||||
ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\
|
AA(6);
|
||||||
ptr[ j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j]));
|
AA(7);
|
||||||
|
|
||||||
INT_AA(0)
|
|
||||||
INT_AA(1)
|
|
||||||
INT_AA(2)
|
|
||||||
INT_AA(3)
|
|
||||||
INT_AA(4)
|
|
||||||
INT_AA(5)
|
|
||||||
INT_AA(6)
|
|
||||||
INT_AA(7)
|
|
||||||
|
|
||||||
ptr += 18;
|
ptr += 18;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void compute_imdct(MPADecodeContext *s,
|
static void compute_imdct(MPADecodeContext *s,
|
||||||
GranuleDef *g,
|
GranuleDef *g,
|
||||||
@ -1470,7 +1454,7 @@ static void compute_imdct(MPADecodeContext *s,
|
|||||||
/* main layer3 decoding function */
|
/* main layer3 decoding function */
|
||||||
static int mp_decode_layer3(MPADecodeContext *s)
|
static int mp_decode_layer3(MPADecodeContext *s)
|
||||||
{
|
{
|
||||||
int nb_granules, main_data_begin, private_bits;
|
int nb_granules, main_data_begin;
|
||||||
int gr, ch, blocksplit_flag, i, j, k, n, bits_pos;
|
int gr, ch, blocksplit_flag, i, j, k, n, bits_pos;
|
||||||
GranuleDef *g;
|
GranuleDef *g;
|
||||||
int16_t exponents[576]; //FIXME try INTFLOAT
|
int16_t exponents[576]; //FIXME try INTFLOAT
|
||||||
@ -1478,14 +1462,14 @@ static int mp_decode_layer3(MPADecodeContext *s)
|
|||||||
/* read side info */
|
/* read side info */
|
||||||
if (s->lsf) {
|
if (s->lsf) {
|
||||||
main_data_begin = get_bits(&s->gb, 8);
|
main_data_begin = get_bits(&s->gb, 8);
|
||||||
private_bits = get_bits(&s->gb, s->nb_channels);
|
skip_bits(&s->gb, s->nb_channels);
|
||||||
nb_granules = 1;
|
nb_granules = 1;
|
||||||
} else {
|
} else {
|
||||||
main_data_begin = get_bits(&s->gb, 9);
|
main_data_begin = get_bits(&s->gb, 9);
|
||||||
if (s->nb_channels == 2)
|
if (s->nb_channels == 2)
|
||||||
private_bits = get_bits(&s->gb, 3);
|
skip_bits(&s->gb, 3);
|
||||||
else
|
else
|
||||||
private_bits = get_bits(&s->gb, 5);
|
skip_bits(&s->gb, 5);
|
||||||
nb_granules = 2;
|
nb_granules = 2;
|
||||||
for(ch=0;ch<s->nb_channels;ch++) {
|
for(ch=0;ch<s->nb_channels;ch++) {
|
||||||
s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */
|
s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */
|
||||||
@ -1703,7 +1687,7 @@ static int mp_decode_layer3(MPADecodeContext *s)
|
|||||||
g = &s->granules[ch][gr];
|
g = &s->granules[ch][gr];
|
||||||
|
|
||||||
reorder_block(s, g);
|
reorder_block(s, g);
|
||||||
RENAME(compute_antialias)(s, g);
|
compute_antialias(s, g);
|
||||||
compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]);
|
compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]);
|
||||||
}
|
}
|
||||||
} /* gr */
|
} /* gr */
|
||||||
|
@ -22,45 +22,6 @@
|
|||||||
#define CONFIG_FLOAT 1
|
#define CONFIG_FLOAT 1
|
||||||
#include "mpegaudiodec.c"
|
#include "mpegaudiodec.c"
|
||||||
|
|
||||||
static void compute_antialias_float(MPADecodeContext *s,
|
|
||||||
GranuleDef *g)
|
|
||||||
{
|
|
||||||
float *ptr;
|
|
||||||
int n, i;
|
|
||||||
|
|
||||||
/* we antialias only "long" bands */
|
|
||||||
if (g->block_type == 2) {
|
|
||||||
if (!g->switch_point)
|
|
||||||
return;
|
|
||||||
/* XXX: check this for 8000Hz case */
|
|
||||||
n = 1;
|
|
||||||
} else {
|
|
||||||
n = SBLIMIT - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = g->sb_hybrid + 18;
|
|
||||||
for(i = n;i > 0;i--) {
|
|
||||||
float tmp0, tmp1;
|
|
||||||
float *csa = &csa_table_float[0][0];
|
|
||||||
#define FLOAT_AA(j)\
|
|
||||||
tmp0= ptr[-1-j];\
|
|
||||||
tmp1= ptr[ j];\
|
|
||||||
ptr[-1-j] = tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j];\
|
|
||||||
ptr[ j] = tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j];
|
|
||||||
|
|
||||||
FLOAT_AA(0)
|
|
||||||
FLOAT_AA(1)
|
|
||||||
FLOAT_AA(2)
|
|
||||||
FLOAT_AA(3)
|
|
||||||
FLOAT_AA(4)
|
|
||||||
FLOAT_AA(5)
|
|
||||||
FLOAT_AA(6)
|
|
||||||
FLOAT_AA(7)
|
|
||||||
|
|
||||||
ptr += 18;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_MP1FLOAT_DECODER
|
#if CONFIG_MP1FLOAT_DECODER
|
||||||
AVCodec ff_mp1float_decoder =
|
AVCodec ff_mp1float_decoder =
|
||||||
{
|
{
|
||||||
|
@ -1612,7 +1612,7 @@ static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
|||||||
|
|
||||||
s->mv_min.x = -MARGIN;
|
s->mv_min.x = -MARGIN;
|
||||||
s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
|
s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
|
||||||
if (prev_frame && s->segmentation.enabled && s->segmentation.update_map)
|
if (prev_frame && s->segmentation.enabled && !s->segmentation.update_map)
|
||||||
ff_thread_await_progress(prev_frame, mb_y, 0);
|
ff_thread_await_progress(prev_frame, mb_y, 0);
|
||||||
|
|
||||||
for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
|
for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
|
||||||
|
@ -1288,20 +1288,49 @@ static int mov_write_tapt_tag(AVIOContext *pb, MOVTrack *track)
|
|||||||
// This box seems important for the psp playback ... without it the movie seems to hang
|
// This box seems important for the psp playback ... without it the movie seems to hang
|
||||||
static int mov_write_edts_tag(AVIOContext *pb, MOVTrack *track)
|
static int mov_write_edts_tag(AVIOContext *pb, MOVTrack *track)
|
||||||
{
|
{
|
||||||
avio_wb32(pb, 0x24); /* size */
|
int64_t duration = av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
|
||||||
|
track->timescale, AV_ROUND_UP);
|
||||||
|
int version = duration < INT32_MAX ? 0 : 1;
|
||||||
|
int entry_size, entry_count, size;
|
||||||
|
int64_t delay, start_ct = track->cluster[0].cts;
|
||||||
|
delay = av_rescale_rnd(track->cluster[0].dts + start_ct, MOV_TIMESCALE,
|
||||||
|
track->timescale, AV_ROUND_DOWN);
|
||||||
|
version |= delay < INT32_MAX ? 0 : 1;
|
||||||
|
|
||||||
|
entry_size = (version == 1) ? 20 : 12;
|
||||||
|
entry_count = 1 + (delay > 0);
|
||||||
|
size = 24 + entry_count * entry_size;
|
||||||
|
|
||||||
|
/* write the atom data */
|
||||||
|
avio_wb32(pb, size);
|
||||||
ffio_wfourcc(pb, "edts");
|
ffio_wfourcc(pb, "edts");
|
||||||
avio_wb32(pb, 0x1c); /* size */
|
avio_wb32(pb, size - 8);
|
||||||
ffio_wfourcc(pb, "elst");
|
ffio_wfourcc(pb, "elst");
|
||||||
avio_wb32(pb, 0x0);
|
avio_w8(pb, version);
|
||||||
avio_wb32(pb, 0x1);
|
avio_wb24(pb, 0); /* flags */
|
||||||
|
|
||||||
/* duration ... doesn't seem to effect psp */
|
avio_wb32(pb, entry_count);
|
||||||
avio_wb32(pb, av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
|
if (delay > 0) { /* add an empty edit to delay presentation */
|
||||||
track->timescale, AV_ROUND_UP));
|
if (version == 1) {
|
||||||
|
avio_wb64(pb, delay);
|
||||||
avio_wb32(pb, track->cluster[0].cts); /* first pts is cts since dts is 0 */
|
avio_wb64(pb, -1);
|
||||||
|
} else {
|
||||||
|
avio_wb32(pb, delay);
|
||||||
|
avio_wb32(pb, -1);
|
||||||
|
}
|
||||||
avio_wb32(pb, 0x00010000);
|
avio_wb32(pb, 0x00010000);
|
||||||
return 0x24;
|
}
|
||||||
|
|
||||||
|
/* duration */
|
||||||
|
if (version == 1) {
|
||||||
|
avio_wb64(pb, duration);
|
||||||
|
avio_wb64(pb, start_ct);
|
||||||
|
} else {
|
||||||
|
avio_wb32(pb, duration);
|
||||||
|
avio_wb32(pb, start_ct);
|
||||||
|
}
|
||||||
|
avio_wb32(pb, 0x00010000);
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mov_write_tref_tag(AVIOContext *pb, MOVTrack *track)
|
static int mov_write_tref_tag(AVIOContext *pb, MOVTrack *track)
|
||||||
@ -1358,7 +1387,7 @@ static int mov_write_trak_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
|
|||||||
avio_wb32(pb, 0); /* size */
|
avio_wb32(pb, 0); /* size */
|
||||||
ffio_wfourcc(pb, "trak");
|
ffio_wfourcc(pb, "trak");
|
||||||
mov_write_tkhd_tag(pb, track, st);
|
mov_write_tkhd_tag(pb, track, st);
|
||||||
if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS)
|
if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS || track->cluster[0].dts)
|
||||||
mov_write_edts_tag(pb, track); // PSP Movies require edts box
|
mov_write_edts_tag(pb, track); // PSP Movies require edts box
|
||||||
if (track->tref_tag)
|
if (track->tref_tag)
|
||||||
mov_write_tref_tag(pb, track);
|
mov_write_tref_tag(pb, track);
|
||||||
|
Loading…
Reference in New Issue
Block a user