* 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
Unified · Split
| @@ -77,22 +77,31 @@ API changes, most recent first: · 76 unmodified lines | ||
| 77 | 77 | 2012-03-26 - a67d9cf - lavfi 2.66.100 |
| 78 | 78 | Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. |
| 79 | 79 | |
| 80 | −2012-08-08 - xxxxxxx - lavu 51.38 - dict.h | |
| 80 | +2012-08-18 - lavc 54.26 - avcodec.h | |
| 81 | + Add codec descriptors for accessing codec properties without having | |
| 82 | + to refer to a specific decoder or encoder. | |
| 83 | + | |
| 84 | + c223d79 - Add an AVCodecDescriptor struct and functions | |
| 85 | + avcodec_descriptor_get() and avcodec_descriptor_next(). | |
| 86 | + 51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY. | |
| 87 | + 91e59fe - Add avcodec_descriptor_get_by_name(). | |
| 88 | + | |
| 89 | +2012-08-08 - 987170c - lavu 51.38 - dict.h | |
| 81 | 90 | Add av_dict_count(). |
| 82 | 91 | |
| 83 | −2012-08-xx - xxxxxxx - lavc 54.25 - avcodec.h | |
| 92 | +2012-08-07 - 104e10f - lavc 54.25 - avcodec.h | |
| 84 | 93 | Rename CodecID to AVCodecID and all CODEC_ID_* to AV_CODEC_ID_*. |
| 85 | 94 | To provide backwards compatibility, CodecID is now #defined as AVCodecID. |
| 86 | 95 | Note that this can break user code that includes avcodec.h and uses the |
| 87 | 96 | 'CodecID' identifier. Such code should either #undef CodecID or stop using the |
| 88 | 97 | CodecID name. |
| 89 | 98 | |
| 90 | −2012-08-03 - xxxxxxx - lavu 51.37.1 - cpu.h | |
| 99 | +2012-08-03 - 239fdf1 - lavu 51.37.1 - cpu.h | |
| 91 | 100 | lsws 2.1.1 - swscale.h |
| 92 | 101 | Rename AV_CPU_FLAG_MMX2 ---> AV_CPU_FLAG_MMXEXT. |
| 93 | 102 | Rename SWS_CPU_CAPS_MMX2 ---> SWS_CPU_CAPS_MMXEXT. |
| 94 | 103 | |
| 95 | −2012-07-xx - xxxxxxx - lavf 54.13.0 - avformat.h | |
| 104 | +2012-07-29 - 681ed00 - lavf 54.13.0 - avformat.h | |
| 96 | 105 | Add AVFMT_FLAG_NOBUFFER for low latency use cases. |
| 97 | 106 | |
| 98 | 107 | 2012-07-10 - 5fade8a - lavu 51.37.0 |
| @@ -616,10 +616,11 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, · 615 unmodified lines | ||
| 616 | 616 | |
| 617 | 617 | if (avctx->trellis > 0) { |
| 618 | 618 | FF_ALLOC_OR_GOTO(avctx, buf, 2 * n, error); |
| 619 | − adpcm_compress_trellis(avctx, samples + 2, buf, &c->status[0], n); | |
| 619 | + adpcm_compress_trellis(avctx, samples + avctx->channels, buf, | |
| 620 | + &c->status[0], n); | |
| 620 | 621 | if (avctx->channels == 2) |
| 621 | − adpcm_compress_trellis(avctx, samples + 3, buf + n, | |
| 622 | − &c->status[1], n); | |
| 622 | + adpcm_compress_trellis(avctx, samples + avctx->channels + 1, | |
| 623 | + buf + n, &c->status[1], n); | |
| 623 | 624 | for (i = 0; i < n; i++) { |
| 624 | 625 | put_bits(&pb, 4, buf[i]); |
| 625 | 626 | if (avctx->channels == 2) |
| @@ -78,17 +78,15 @@ typedef struct AlacEncodeContext { · 77 unmodified lines | ||
| 78 | 78 | } AlacEncodeContext; |
| 79 | 79 | |
| 80 | 80 | |
| 81 | −static void init_sample_buffers(AlacEncodeContext *s, | |
| 82 | − const int16_t *input_samples) | |
| 81 | +static void init_sample_buffers(AlacEncodeContext *s, int16_t **input_samples) | |
| 83 | 82 | { |
| 84 | 83 | int ch, i; |
| 85 | 84 | |
| 86 | 85 | for (ch = 0; ch < s->avctx->channels; ch++) { |
| 87 | − const int16_t *sptr = input_samples + ch; | |
| 88 | − for (i = 0; i < s->frame_size; i++) { | |
| 89 | − s->sample_buf[ch][i] = *sptr; | |
| 90 | − sptr += s->avctx->channels; | |
| 91 | − } | |
| 86 | + int32_t *bptr = s->sample_buf[ch]; | |
| 87 | + const int16_t *sptr = input_samples[ch]; | |
| 88 | + for (i = 0; i < s->frame_size; i++) | |
| 89 | + bptr[i] = sptr[i]; | |
| 92 | 90 | } |
| 93 | 91 | } |
| 94 | 92 | |
| @@ -347,8 +345,7 @@ static void alac_entropy_coder(AlacEncodeContext *s) · 252 unmodified lines | ||
| 347 | 345 | } |
| 348 | 346 | } |
| 349 | 347 | |
| 350 | −static int write_frame(AlacEncodeContext *s, AVPacket *avpkt, | |
| 351 | − const int16_t *samples) | |
| 348 | +static int write_frame(AlacEncodeContext *s, AVPacket *avpkt, int16_t **samples) | |
| 352 | 349 | { |
| 353 | 350 | int i, j; |
| 354 | 351 | int prediction_type = 0; |
| @@ -358,8 +355,10 @@ static int write_frame(AlacEncodeContext *s, AVPacket *avpkt, · 3 unmodified lines | ||
| 358 | 355 | |
| 359 | 356 | if (s->verbatim) { |
| 360 | 357 | write_frame_header(s); |
| 361 | − for (i = 0; i < s->frame_size * s->avctx->channels; i++) | |
| 362 | − put_sbits(pb, 16, *samples++); | |
| 358 | + /* samples are channel-interleaved in verbatim mode */ | |
| 359 | + for (i = 0; i < s->frame_size; i++) | |
| 360 | + for (j = 0; j < s->avctx->channels; j++) | |
| 361 | + put_sbits(pb, 16, samples[j][i]); | |
| 363 | 362 | } else { |
| 364 | 363 | init_sample_buffers(s, samples); |
| 365 | 364 | write_frame_header(s); |
| @@ -426,11 +425,6 @@ static av_cold int alac_encode_init(AVCodecContext *avctx) · 60 unmodified lines | ||
| 426 | 425 | |
| 427 | 426 | avctx->frame_size = s->frame_size = DEFAULT_FRAME_SIZE; |
| 428 | 427 | |
| 429 | − if (avctx->sample_fmt != AV_SAMPLE_FMT_S16) { | |
| 430 | − av_log(avctx, AV_LOG_ERROR, "only pcm_s16 input samples are supported\n"); | |
| 431 | − return -1; | |
| 432 | − } | |
| 433 | − | |
| 434 | 428 | /* TODO: Correctly implement multi-channel ALAC. |
| 435 | 429 | It is similar to multi-channel AAC, in that it has a series of |
| 436 | 430 | single-channel (SCE), channel-pair (CPE), and LFE elements. */ |
| @@ -542,11 +536,11 @@ static int alac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, · 105 unmodified lines | ||
| 542 | 536 | { |
| 543 | 537 | AlacEncodeContext *s = avctx->priv_data; |
| 544 | 538 | int out_bytes, max_frame_size, ret; |
| 545 | − const int16_t *samples = (const int16_t *)frame->data[0]; | |
| 539 | + int16_t **samples = (int16_t **)frame->extended_data; | |
| 546 | 540 | |
| 547 | 541 | s->frame_size = frame->nb_samples; |
| 548 | 542 | |
| 549 | − if (avctx->frame_size < DEFAULT_FRAME_SIZE) | |
| 543 | + if (frame->nb_samples < DEFAULT_FRAME_SIZE) | |
| 550 | 544 | max_frame_size = get_max_frame_size(s->frame_size, avctx->channels, |
| 551 | 545 | DEFAULT_SAMPLE_SIZE); |
| 552 | 546 | else |
| @@ -580,7 +574,7 @@ AVCodec ff_alac_encoder = { · 27 unmodified lines | ||
| 580 | 574 | .encode2 = alac_encode_frame, |
| 581 | 575 | .close = alac_encode_close, |
| 582 | 576 | .capabilities = CODEC_CAP_SMALL_LAST_FRAME, |
| 583 | − .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, | |
| 577 | + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P, | |
| 584 | 578 | AV_SAMPLE_FMT_NONE }, |
| 585 | 579 | .long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"), |
| 586 | 580 | }; |
| @@ -179,11 +179,9 @@ int ff_lpc_calc_coefs(LPCContext *s, · 178 unmodified lines | ||
| 179 | 179 | } |
| 180 | 180 | |
| 181 | 181 | if (lpc_type == FF_LPC_TYPE_LEVINSON) { |
| 182 | − double *windowed_samples = s->windowed_samples + max_order; | |
| 182 | + s->lpc_apply_welch_window(samples, blocksize, s->windowed_samples); | |
| 183 | 183 | |
| 184 | − s->lpc_apply_welch_window(samples, blocksize, windowed_samples); | |
| 185 | − | |
| 186 | − s->lpc_compute_autocorr(windowed_samples, blocksize, max_order, autoc); | |
| 184 | + s->lpc_compute_autocorr(s->windowed_samples, blocksize, max_order, autoc); | |
| 187 | 185 | |
| 188 | 186 | compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1); |
| 189 | 187 | |
| @@ -252,10 +250,11 @@ av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order, · 62 unmodified lines | ||
| 252 | 250 | s->lpc_type = lpc_type; |
| 253 | 251 | |
| 254 | 252 | if (lpc_type == FF_LPC_TYPE_LEVINSON) { |
| 255 | − s->windowed_samples = av_mallocz((blocksize + max_order + 2) * | |
| 256 | − sizeof(*s->windowed_samples)); | |
| 257 | − if (!s->windowed_samples) | |
| 253 | + s->windowed_buffer = av_mallocz((blocksize + 2 + FFALIGN(max_order, 4)) * | |
| 254 | + sizeof(*s->windowed_samples)); | |
| 255 | + if (!s->windowed_buffer) | |
| 258 | 256 | return AVERROR(ENOMEM); |
| 257 | + s->windowed_samples = s->windowed_buffer + FFALIGN(max_order, 4); | |
| 259 | 258 | } else { |
| 260 | 259 | s->windowed_samples = NULL; |
| 261 | 260 | } |
| @@ -271,5 +270,5 @@ av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order, · 9 unmodified lines | ||
| 271 | 270 | |
| 272 | 271 | av_cold void ff_lpc_end(LPCContext *s) |
| 273 | 272 | { |
| 274 | − av_freep(&s->windowed_samples); | |
| 273 | + av_freep(&s->windowed_buffer); | |
| 275 | 274 | } |
| @@ -51,6 +51,7 @@ typedef struct LPCContext { · 50 unmodified lines | ||
| 51 | 51 | int blocksize; |
| 52 | 52 | int max_order; |
| 53 | 53 | enum FFLPCType lpc_type; |
| 54 | + double *windowed_buffer; | |
| 54 | 55 | double *windowed_samples; |
| 55 | 56 | |
| 56 | 57 | /** |
| @@ -1235,6 +1235,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, · 1234 unmodified lines | ||
| 1235 | 1235 | /* mjpeg-b can have padding bytes between sos and image data, skip them */ |
| 1236 | 1236 | for (i = s->mjpb_skiptosod; i > 0; i--) |
| 1237 | 1237 | skip_bits(&s->gb, 8); |
| 1238 | + | |
| 1238 | 1239 | next_field: |
| 1239 | 1240 | for (i = 0; i < nb_components; i++) |
| 1240 | 1241 | s->last_dc[i] = 1024; |
| @@ -1271,11 +1272,14 @@ next_field: · 30 unmodified lines | ||
| 1271 | 1272 | return ret; |
| 1272 | 1273 | } |
| 1273 | 1274 | } |
| 1274 | − if(s->interlaced && get_bits_left(&s->gb) > 32 && show_bits(&s->gb, 8) == 0xFF) { | |
| 1275 | − GetBitContext bak= s->gb; | |
| 1275 | + | |
| 1276 | + if (s->interlaced && | |
| 1277 | + get_bits_left(&s->gb) > 32 && | |
| 1278 | + show_bits(&s->gb, 8) == 0xFF) { | |
| 1279 | + GetBitContext bak = s->gb; | |
| 1276 | 1280 | align_get_bits(&bak); |
| 1277 | − if(show_bits(&bak, 16) == 0xFFD1) { | |
| 1278 | − av_log(s->avctx, AV_LOG_DEBUG, "AVRn ingterlaced picture\n"); | |
| 1281 | + if (show_bits(&bak, 16) == 0xFFD1) { | |
| 1282 | + av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n"); | |
| 1279 | 1283 | s->gb = bak; |
| 1280 | 1284 | skip_bits(&s->gb, 16); |
| 1281 | 1285 | s->bottom_field ^= 1; |
| @@ -1177,8 +1177,9 @@ static av_cold int vorbis_encode_init(AVCodecContext *avccontext) · 1176 unmodified lines | ||
| 1177 | 1177 | if ((ret = create_vorbis_context(venc, avccontext)) < 0) |
| 1178 | 1178 | goto error; |
| 1179 | 1179 | |
| 1180 | + avccontext->bit_rate = 0; | |
| 1180 | 1181 | if (avccontext->flags & CODEC_FLAG_QSCALE) |
| 1181 | − venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA / 10.; | |
| 1182 | + venc->quality = avccontext->global_quality / (float)FF_QP2LAMBDA; | |
| 1182 | 1183 | else |
| 1183 | 1184 | venc->quality = 8; |
| 1184 | 1185 | venc->quality *= venc->quality; |
| @@ -549,7 +549,7 @@ static int gen_release_stream(URLContext *s, RTMPContext *rt) · 548 unmodified lines | ||
| 549 | 549 | ff_amf_write_null(&p); |
| 550 | 550 | ff_amf_write_string(&p, rt->playpath); |
| 551 | 551 | |
| 552 | − return rtmp_send_packet(rt, &pkt, 0); | |
| 552 | + return rtmp_send_packet(rt, &pkt, 1); | |
| 553 | 553 | } |
| 554 | 554 | |
| 555 | 555 | /** |
| @@ -573,7 +573,7 @@ static int gen_fcpublish_stream(URLContext *s, RTMPContext *rt) · 17 unmodified lines | ||
| 573 | 573 | ff_amf_write_null(&p); |
| 574 | 574 | ff_amf_write_string(&p, rt->playpath); |
| 575 | 575 | |
| 576 | − return rtmp_send_packet(rt, &pkt, 0); | |
| 576 | + return rtmp_send_packet(rt, &pkt, 1); | |
| 577 | 577 | } |
| 578 | 578 | |
| 579 | 579 | /** |
| @@ -1525,8 +1525,11 @@ static int handle_invoke_error(URLContext *s, RTMPPacket *pkt) · 945 unmodified lines | ||
| 1525 | 1525 | |
| 1526 | 1526 | if (!ff_amf_get_field_value(pkt->data + 9, data_end, |
| 1527 | 1527 | "description", tmpstr, sizeof(tmpstr))) { |
| 1528 | − if (tracked_method && !strcmp(tracked_method, "_checkbw")) { | |
| 1529 | − /* Ignore _checkbw errors. */ | |
| 1528 | + if (tracked_method && (!strcmp(tracked_method, "_checkbw") || | |
| 1529 | + !strcmp(tracked_method, "releaseStream") || | |
| 1530 | + !strcmp(tracked_method, "FCSubscribe") || | |
| 1531 | + !strcmp(tracked_method, "FCPublish"))) { | |
| 1532 | + /* Gracefully ignore Adobe-specific historical artifact errors. */ | |
| 1530 | 1533 | level = AV_LOG_WARNING; |
| 1531 | 1534 | ret = 0; |
| 1532 | 1535 | } else |
| @@ -38,6 +38,7 @@ include $(SRC_PATH)/tests/fate/vcodec.mak · 37 unmodified lines | ||
| 38 | 38 | include $(SRC_PATH)/tests/fate/aac.mak |
| 39 | 39 | include $(SRC_PATH)/tests/fate/ac3.mak |
| 40 | 40 | include $(SRC_PATH)/tests/fate/adpcm.mak |
| 41 | +include $(SRC_PATH)/tests/fate/alac.mak | |
| 41 | 42 | include $(SRC_PATH)/tests/fate/als.mak |
| 42 | 43 | include $(SRC_PATH)/tests/fate/amrnb.mak |
| 43 | 44 | include $(SRC_PATH)/tests/fate/amrwb.mak |
| @@ -0,0 +1,15 @@ | ||
| 1 | +FATE_ALAC += fate-alac-level-0 \ | |
| 2 | + fate-alac-level-1 \ | |
| 3 | + fate-alac-level-2 \ | |
| 4 | + fate-alac-lpc-orders \ | |
| 5 | + | |
| 6 | +fate-alac-level-%: OPTS = -compression_level $(@:fate-alac-level-%=%) | |
| 7 | +fate-alac-lpc-orders: OPTS = -min_prediction_order 1 -max_prediction_order 30 | |
| 8 | + | |
| 9 | +fate-alac-%: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |
| 10 | +fate-alac-%: CMD = enc_dec_pcm mov wav s16le $(REF) -c alac $(OPTS) | |
| 11 | +fate-alac-%: CMP = oneoff | |
| 12 | +fate-alac-%: FUZZ = 0 | |
| 13 | + | |
| 14 | +FATE_SAMPLES_AVCONV += $(FATE_ALAC) | |
| 15 | +fate-alac: $(FATE_ALAC) | |