X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdvenc.c;h=458f39b558d97135163902d6a8697129f40b7e63;hb=0bf3a7361d17d596a5044882098f56817db0e103;hp=dca57feb4f44f60be33e6a487c2b48664f2d9915;hpb=a1403032c8cb0f78caa7723df940b13d247cfe47;p=ffmpeg diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c index dca57feb4f4..458f39b558d 100644 --- a/libavcodec/dvenc.c +++ b/libavcodec/dvenc.c @@ -30,6 +30,7 @@ #include "libavutil/attributes.h" #include "libavutil/internal.h" +#include "libavutil/mem_internal.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" @@ -215,8 +216,8 @@ static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) { int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400; if (ps > 0) { - int is = s->ildct_cmp(NULL, data, NULL, linesize << 1, 4) + - s->ildct_cmp(NULL, data + linesize, NULL, linesize << 1, 4); + int is = s->ildct_cmp(NULL, data, NULL, linesize * 2, 4) + + s->ildct_cmp(NULL, data + linesize, NULL, linesize * 2, 4); return ps > is; } } @@ -317,9 +318,8 @@ static const int dv100_qstep_inv[16] = { 65536, 65536, 32768, 21845, 16384, 13107, 10923, 9362, 8192, 4096, 3641, 3277, 2979, 2731, 2341, 1260, }; -/* DV100 weights are pre-zigzagged, inverted and multiplied by 2^(dv100_weight_shift) +/* DV100 weights are pre-zigzagged, inverted and multiplied by 2^16 (in DV100 the AC components are divided by the spec weights) */ -static const int dv100_weight_shift = 16; static const int dv_weight_1080[2][64] = { { 8192, 65536, 65536, 61681, 61681, 61681, 58254, 58254, 58254, 58254, 58254, 58254, 55188, 58254, 58254, 55188, @@ -511,7 +511,7 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, i if (data) { if (DV_PROFILE_IS_HD(s->sys)) { - s->get_pixels(blk, data, linesize << bi->dct_mode); + s->get_pixels(blk, data, linesize * (1 << bi->dct_mode)); s->fdct[0](blk); } else { bi->dct_mode = dv_guess_dct_mode(s, data, linesize); @@ -860,7 +860,7 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) qnos[mb_index] = DV_PROFILE_IS_HD(s->sys) ? 1 : 15; - y_ptr = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << 3); + y_ptr = s->frame->data[0] + (mb_y * s->frame->linesize[0] + mb_x) * 8; linesize = s->frame->linesize[0]; if (s->sys->height == 1080 && mb_y < 134) @@ -874,12 +874,12 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) || (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) || (s->sys->height >= 720 && mb_y != 134)) { - y_stride = s->frame->linesize[0] << (3*!enc_blk->dct_mode); + y_stride = s->frame->linesize[0] * (1 << (3*!enc_blk->dct_mode)); } else { y_stride = 16; } y_ptr = s->frame->data[0] + - ((mb_y * s->frame->linesize[0] + mb_x) << 3); + (mb_y * s->frame->linesize[0] + mb_x) * 8; linesize = s->frame->linesize[0]; if (s->sys->video_stype == 4) { /* SD 422 */ @@ -898,17 +898,17 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) enc_blk += 4; /* initializing chrominance blocks */ - c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] + - (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3); + c_offset = ((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] + + (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) * 8; for (j = 2; j; j--) { uint8_t *c_ptr = s->frame->data[j] + c_offset; linesize = s->frame->linesize[j]; - y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << (3*!enc_blk->dct_mode)); + y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] * (1 << (3*!enc_blk->dct_mode))); if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) { uint8_t *d; uint8_t *b = scratch; for (i = 0; i < 8; i++) { - d = c_ptr + (linesize << 3); + d = c_ptr + linesize * 8; b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; @@ -976,16 +976,8 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) } for (j = 0; j < 5 * s->sys->bpm; j++) { - int pos; - int size = pbs[j].size_in_bits >> 3; flush_put_bits(&pbs[j]); - pos = put_bits_count(&pbs[j]) >> 3; - if (pos > size) { - av_log(avctx, AV_LOG_ERROR, - "bitstream written beyond buffer size\n"); - return -1; - } - memset(pbs[j].buf + pos, 0xff, size - pos); + memset(put_bits_ptr(&pbs[j]), 0xff, put_bytes_left(&pbs[j], 0)); } if (DV_PROFILE_IS_HD(s->sys)) @@ -1177,12 +1169,6 @@ static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt, c->pix_fmt = s->sys->pix_fmt; s->frame = frame; -#if FF_API_CODED_FRAME -FF_DISABLE_DEPRECATION_WARNINGS - c->coded_frame->key_frame = 1; - c->coded_frame->pict_type = AV_PICTURE_TYPE_I; -FF_ENABLE_DEPRECATION_WARNINGS -#endif s->buf = pkt->data; dv_format_frame(s, pkt->data); @@ -1212,7 +1198,7 @@ static const AVClass dvvideo_encode_class = { .version = LIBAVUTIL_VERSION_INT, }; -AVCodec ff_dvvideo_encoder = { +const AVCodec ff_dvvideo_encoder = { .name = "dvvideo", .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), .type = AVMEDIA_TYPE_VIDEO, @@ -1220,7 +1206,7 @@ AVCodec ff_dvvideo_encoder = { .priv_data_size = sizeof(DVVideoContext), .init = dvvideo_encode_init, .encode2 = dvvideo_encode_frame, - .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY, + .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE