1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  doc/APIchanges: add an entry for codec descriptors.
  vorbisenc: set AVCodecContext.bit_rate to 0
  vorbisenc: fix quality parameter
  FATE: add ALAC encoding tests
  lpc: fix alignment of windowed samples for odd maximum LPC order
  alacenc: use s16p sample format as input
  alacenc: remove unneeded sample_fmt check
  alacenc: fix max_frame_size calculation for the final frame
  adpcm_swf: Use correct sample offsets when using trellis.
  rtmp: support strict rtmp servers
  mjpegdec: support AVRn interlaced
  x86: remove FASTDIV inline asm

Conflicts:
	doc/APIchanges
	libavcodec/mjpegdec.c
	libavcodec/vorbisenc.c
	libavutil/x86/intmath.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2012-08-23 14:23:08 +02:00
commit 104f42e694
10 changed files with 71 additions and 43 deletions

View File

@ -77,22 +77,31 @@ API changes, most recent first:
2012-03-26 - a67d9cf - lavfi 2.66.100 2012-03-26 - a67d9cf - lavfi 2.66.100
Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
2012-08-08 - xxxxxxx - lavu 51.38 - dict.h 2012-08-18 - lavc 54.26 - avcodec.h
Add codec descriptors for accessing codec properties without having
to refer to a specific decoder or encoder.
c223d79 - Add an AVCodecDescriptor struct and functions
avcodec_descriptor_get() and avcodec_descriptor_next().
51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY.
91e59fe - Add avcodec_descriptor_get_by_name().
2012-08-08 - 987170c - lavu 51.38 - dict.h
Add av_dict_count(). Add av_dict_count().
2012-08-xx - xxxxxxx - lavc 54.25 - avcodec.h 2012-08-07 - 104e10f - lavc 54.25 - avcodec.h
Rename CodecID to AVCodecID and all CODEC_ID_* to AV_CODEC_ID_*. Rename CodecID to AVCodecID and all CODEC_ID_* to AV_CODEC_ID_*.
To provide backwards compatibility, CodecID is now #defined as AVCodecID. To provide backwards compatibility, CodecID is now #defined as AVCodecID.
Note that this can break user code that includes avcodec.h and uses the Note that this can break user code that includes avcodec.h and uses the
'CodecID' identifier. Such code should either #undef CodecID or stop using the 'CodecID' identifier. Such code should either #undef CodecID or stop using the
CodecID name. CodecID name.
2012-08-03 - xxxxxxx - lavu 51.37.1 - cpu.h 2012-08-03 - 239fdf1 - lavu 51.37.1 - cpu.h
lsws 2.1.1 - swscale.h lsws 2.1.1 - swscale.h
Rename AV_CPU_FLAG_MMX2 ---> AV_CPU_FLAG_MMXEXT. Rename AV_CPU_FLAG_MMX2 ---> AV_CPU_FLAG_MMXEXT.
Rename SWS_CPU_CAPS_MMX2 ---> SWS_CPU_CAPS_MMXEXT. Rename SWS_CPU_CAPS_MMX2 ---> SWS_CPU_CAPS_MMXEXT.
2012-07-xx - xxxxxxx - lavf 54.13.0 - avformat.h 2012-07-29 - 681ed00 - lavf 54.13.0 - avformat.h
Add AVFMT_FLAG_NOBUFFER for low latency use cases. Add AVFMT_FLAG_NOBUFFER for low latency use cases.
2012-07-10 - 5fade8a - lavu 51.37.0 2012-07-10 - 5fade8a - lavu 51.37.0

View File

@ -616,10 +616,11 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
if (avctx->trellis > 0) { if (avctx->trellis > 0) {
FF_ALLOC_OR_GOTO(avctx, buf, 2 * n, error); FF_ALLOC_OR_GOTO(avctx, buf, 2 * n, error);
adpcm_compress_trellis(avctx, samples + 2, buf, &c->status[0], n); adpcm_compress_trellis(avctx, samples + avctx->channels, buf,
&c->status[0], n);
if (avctx->channels == 2) if (avctx->channels == 2)
adpcm_compress_trellis(avctx, samples + 3, buf + n, adpcm_compress_trellis(avctx, samples + avctx->channels + 1,
&c->status[1], n); buf + n, &c->status[1], n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
put_bits(&pb, 4, buf[i]); put_bits(&pb, 4, buf[i]);
if (avctx->channels == 2) if (avctx->channels == 2)

View File

@ -78,17 +78,15 @@ typedef struct AlacEncodeContext {
} AlacEncodeContext; } AlacEncodeContext;
static void init_sample_buffers(AlacEncodeContext *s, static void init_sample_buffers(AlacEncodeContext *s, int16_t **input_samples)
const int16_t *input_samples)
{ {
int ch, i; int ch, i;
for (ch = 0; ch < s->avctx->channels; ch++) { for (ch = 0; ch < s->avctx->channels; ch++) {
const int16_t *sptr = input_samples + ch; int32_t *bptr = s->sample_buf[ch];
for (i = 0; i < s->frame_size; i++) { const int16_t *sptr = input_samples[ch];
s->sample_buf[ch][i] = *sptr; for (i = 0; i < s->frame_size; i++)
sptr += s->avctx->channels; bptr[i] = sptr[i];
}
} }
} }
@ -347,8 +345,7 @@ static void alac_entropy_coder(AlacEncodeContext *s)
} }
} }
static int write_frame(AlacEncodeContext *s, AVPacket *avpkt, static int write_frame(AlacEncodeContext *s, AVPacket *avpkt, int16_t **samples)
const int16_t *samples)
{ {
int i, j; int i, j;
int prediction_type = 0; int prediction_type = 0;
@ -358,8 +355,10 @@ static int write_frame(AlacEncodeContext *s, AVPacket *avpkt,
if (s->verbatim) { if (s->verbatim) {
write_frame_header(s); write_frame_header(s);
for (i = 0; i < s->frame_size * s->avctx->channels; i++) /* samples are channel-interleaved in verbatim mode */
put_sbits(pb, 16, *samples++); for (i = 0; i < s->frame_size; i++)
for (j = 0; j < s->avctx->channels; j++)
put_sbits(pb, 16, samples[j][i]);
} else { } else {
init_sample_buffers(s, samples); init_sample_buffers(s, samples);
write_frame_header(s); write_frame_header(s);
@ -426,11 +425,6 @@ static av_cold int alac_encode_init(AVCodecContext *avctx)
avctx->frame_size = s->frame_size = DEFAULT_FRAME_SIZE; avctx->frame_size = s->frame_size = DEFAULT_FRAME_SIZE;
if (avctx->sample_fmt != AV_SAMPLE_FMT_S16) {
av_log(avctx, AV_LOG_ERROR, "only pcm_s16 input samples are supported\n");
return -1;
}
/* TODO: Correctly implement multi-channel ALAC. /* TODO: Correctly implement multi-channel ALAC.
It is similar to multi-channel AAC, in that it has a series of It is similar to multi-channel AAC, in that it has a series of
single-channel (SCE), channel-pair (CPE), and LFE elements. */ single-channel (SCE), channel-pair (CPE), and LFE elements. */
@ -542,11 +536,11 @@ static int alac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
{ {
AlacEncodeContext *s = avctx->priv_data; AlacEncodeContext *s = avctx->priv_data;
int out_bytes, max_frame_size, ret; int out_bytes, max_frame_size, ret;
const int16_t *samples = (const int16_t *)frame->data[0]; int16_t **samples = (int16_t **)frame->extended_data;
s->frame_size = frame->nb_samples; s->frame_size = frame->nb_samples;
if (avctx->frame_size < DEFAULT_FRAME_SIZE) if (frame->nb_samples < DEFAULT_FRAME_SIZE)
max_frame_size = get_max_frame_size(s->frame_size, avctx->channels, max_frame_size = get_max_frame_size(s->frame_size, avctx->channels,
DEFAULT_SAMPLE_SIZE); DEFAULT_SAMPLE_SIZE);
else else
@ -580,7 +574,7 @@ AVCodec ff_alac_encoder = {
.encode2 = alac_encode_frame, .encode2 = alac_encode_frame,
.close = alac_encode_close, .close = alac_encode_close,
.capabilities = CODEC_CAP_SMALL_LAST_FRAME, .capabilities = CODEC_CAP_SMALL_LAST_FRAME,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
.long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"), .long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
}; };

View File

@ -179,11 +179,9 @@ int ff_lpc_calc_coefs(LPCContext *s,
} }
if (lpc_type == FF_LPC_TYPE_LEVINSON) { if (lpc_type == FF_LPC_TYPE_LEVINSON) {
double *windowed_samples = s->windowed_samples + max_order; s->lpc_apply_welch_window(samples, blocksize, s->windowed_samples);
s->lpc_apply_welch_window(samples, blocksize, windowed_samples); s->lpc_compute_autocorr(s->windowed_samples, blocksize, max_order, autoc);
s->lpc_compute_autocorr(windowed_samples, blocksize, max_order, autoc);
compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1); compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1);
@ -252,10 +250,11 @@ av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order,
s->lpc_type = lpc_type; s->lpc_type = lpc_type;
if (lpc_type == FF_LPC_TYPE_LEVINSON) { if (lpc_type == FF_LPC_TYPE_LEVINSON) {
s->windowed_samples = av_mallocz((blocksize + max_order + 2) * s->windowed_buffer = av_mallocz((blocksize + 2 + FFALIGN(max_order, 4)) *
sizeof(*s->windowed_samples)); sizeof(*s->windowed_samples));
if (!s->windowed_samples) if (!s->windowed_buffer)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
s->windowed_samples = s->windowed_buffer + FFALIGN(max_order, 4);
} else { } else {
s->windowed_samples = NULL; s->windowed_samples = NULL;
} }
@ -271,5 +270,5 @@ av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order,
av_cold void ff_lpc_end(LPCContext *s) av_cold void ff_lpc_end(LPCContext *s)
{ {
av_freep(&s->windowed_samples); av_freep(&s->windowed_buffer);
} }

View File

@ -51,6 +51,7 @@ typedef struct LPCContext {
int blocksize; int blocksize;
int max_order; int max_order;
enum FFLPCType lpc_type; enum FFLPCType lpc_type;
double *windowed_buffer;
double *windowed_samples; double *windowed_samples;
/** /**

View File

@ -1235,6 +1235,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
/* mjpeg-b can have padding bytes between sos and image data, skip them */ /* mjpeg-b can have padding bytes between sos and image data, skip them */
for (i = s->mjpb_skiptosod; i > 0; i--) for (i = s->mjpb_skiptosod; i > 0; i--)
skip_bits(&s->gb, 8); skip_bits(&s->gb, 8);
next_field: next_field:
for (i = 0; i < nb_components; i++) for (i = 0; i < nb_components; i++)
s->last_dc[i] = 1024; s->last_dc[i] = 1024;
@ -1271,11 +1272,14 @@ next_field:
return ret; return ret;
} }
} }
if(s->interlaced && get_bits_left(&s->gb) > 32 && show_bits(&s->gb, 8) == 0xFF) {
GetBitContext bak= s->gb; if (s->interlaced &&
get_bits_left(&s->gb) > 32 &&
show_bits(&s->gb, 8) == 0xFF) {
GetBitContext bak = s->gb;
align_get_bits(&bak); align_get_bits(&bak);
if(show_bits(&bak, 16) == 0xFFD1) { if (show_bits(&bak, 16) == 0xFFD1) {
av_log(s->avctx, AV_LOG_DEBUG, "AVRn ingterlaced picture\n"); av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
s->gb = bak; s->gb = bak;
skip_bits(&s->gb, 16); skip_bits(&s->gb, 16);
s->bottom_field ^= 1; s->bottom_field ^= 1;

View File

@ -1177,8 +1177,9 @@ static av_cold int vorbis_encode_init(AVCodecContext *avccontext)
if ((ret = create_vorbis_context(venc, avccontext)) < 0) if ((ret = create_vorbis_context(venc, avccontext)) < 0)
goto error; goto error;
avccontext->bit_rate = 0;
if (avccontext->flags & CODEC_FLAG_QSCALE) if (avccontext->flags & CODEC_FLAG_QSCALE)
venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA / 10.; venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA;
else else
venc->quality = 8; venc->quality = 8;
venc->quality *= venc->quality; venc->quality *= venc->quality;

View File

@ -549,7 +549,7 @@ static int gen_release_stream(URLContext *s, RTMPContext *rt)
ff_amf_write_null(&p); ff_amf_write_null(&p);
ff_amf_write_string(&p, rt->playpath); ff_amf_write_string(&p, rt->playpath);
return rtmp_send_packet(rt, &pkt, 0); return rtmp_send_packet(rt, &pkt, 1);
} }
/** /**
@ -573,7 +573,7 @@ static int gen_fcpublish_stream(URLContext *s, RTMPContext *rt)
ff_amf_write_null(&p); ff_amf_write_null(&p);
ff_amf_write_string(&p, rt->playpath); ff_amf_write_string(&p, rt->playpath);
return rtmp_send_packet(rt, &pkt, 0); return rtmp_send_packet(rt, &pkt, 1);
} }
/** /**
@ -1525,8 +1525,11 @@ static int handle_invoke_error(URLContext *s, RTMPPacket *pkt)
if (!ff_amf_get_field_value(pkt->data + 9, data_end, if (!ff_amf_get_field_value(pkt->data + 9, data_end,
"description", tmpstr, sizeof(tmpstr))) { "description", tmpstr, sizeof(tmpstr))) {
if (tracked_method && !strcmp(tracked_method, "_checkbw")) { if (tracked_method && (!strcmp(tracked_method, "_checkbw") ||
/* Ignore _checkbw errors. */ !strcmp(tracked_method, "releaseStream") ||
!strcmp(tracked_method, "FCSubscribe") ||
!strcmp(tracked_method, "FCPublish"))) {
/* Gracefully ignore Adobe-specific historical artifact errors. */
level = AV_LOG_WARNING; level = AV_LOG_WARNING;
ret = 0; ret = 0;
} else } else

View File

@ -38,6 +38,7 @@ include $(SRC_PATH)/tests/fate/vcodec.mak
include $(SRC_PATH)/tests/fate/aac.mak include $(SRC_PATH)/tests/fate/aac.mak
include $(SRC_PATH)/tests/fate/ac3.mak include $(SRC_PATH)/tests/fate/ac3.mak
include $(SRC_PATH)/tests/fate/adpcm.mak include $(SRC_PATH)/tests/fate/adpcm.mak
include $(SRC_PATH)/tests/fate/alac.mak
include $(SRC_PATH)/tests/fate/als.mak include $(SRC_PATH)/tests/fate/als.mak
include $(SRC_PATH)/tests/fate/amrnb.mak include $(SRC_PATH)/tests/fate/amrnb.mak
include $(SRC_PATH)/tests/fate/amrwb.mak include $(SRC_PATH)/tests/fate/amrwb.mak

15
tests/fate/alac.mak Normal file
View File

@ -0,0 +1,15 @@
FATE_ALAC += fate-alac-level-0 \
fate-alac-level-1 \
fate-alac-level-2 \
fate-alac-lpc-orders \
fate-alac-level-%: OPTS = -compression_level $(@:fate-alac-level-%=%)
fate-alac-lpc-orders: OPTS = -min_prediction_order 1 -max_prediction_order 30
fate-alac-%: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
fate-alac-%: CMD = enc_dec_pcm mov wav s16le $(REF) -c alac $(OPTS)
fate-alac-%: CMP = oneoff
fate-alac-%: FUZZ = 0
FATE_SAMPLES_AVCONV += $(FATE_ALAC)
fate-alac: $(FATE_ALAC)