X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fdv.c;h=91b1c80522bfbc84deaf2ef77851d31f1aa321eb;hb=94f28061f572b5946275cd29be0683c22cd58a18;hp=a43e6e43b62993ae5ca1b184cc3262fa04c6594a;hpb=9106a698e726c041128a05db0a011caae755d10b;p=ffmpeg diff --git a/libavcodec/dv.c b/libavcodec/dv.c index a43e6e43b62..91b1c80522b 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -393,6 +393,7 @@ static av_cold int dvvideo_init(AVCodecContext *avctx) avctx->coded_frame = &s->picture; s->avctx = avctx; + avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; return 0; } @@ -415,11 +416,6 @@ static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5; /* see dv_88_areas and dv_248_areas for details */ static const int mb_area_start[5] = { 1, 6, 21, 43, 64 }; -static inline int get_bits_left(GetBitContext *s) -{ - return s->size_in_bits - get_bits_count(s); -} - static inline int put_bits_left(PutBitContext* s) { return (s->buf_end - s->buf) * 8 - put_bits_count(s); @@ -526,8 +522,8 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) GetBitContext gb; BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1; DECLARE_ALIGNED_16(DCTELEM, sblock[5*DV_MAX_BPM][64]); - DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */ - DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */ + uint8_t mb_bit_buffer[80 + 4]; /* allow some slack */ + uint8_t vs_bit_buffer[5 * 80 + 4]; /* allow some slack */ const int log2_blocksize = 3-s->avctx->lowres; int is_field_mode[5]; @@ -630,7 +626,7 @@ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) dv_decode_ac(&gb, mb, block); } if (mb->pos >= 64 && mb->pos < 127) - av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos); + av_log(avctx, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos); block += 64; mb++; } @@ -1076,7 +1072,7 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) int sz = s->sys->block_sizes[i]>>3; init_put_bits(&pbs[j], dif, sz); - put_bits(&pbs[j], 9, (uint16_t)(((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2)); + put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2); put_bits(&pbs[j], 1, enc_blks[j].dct_mode); put_bits(&pbs[j], 2, enc_blks[j].cno); @@ -1098,11 +1094,20 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) if (enc_blks[j].partial_bit_count) pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]); if (enc_blks[j].partial_bit_count) - av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n"); + av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n"); } - for (j=0; j<5*s->sys->bpm; j++) + 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); + } return 0; } @@ -1118,9 +1123,11 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, int buf_size = avpkt->size; DVVideoContext *s = avctx->priv_data; - s->sys = dv_frame_profile(buf); - if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) + s->sys = ff_dv_frame_profile(s->sys, buf, buf_size); + if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) { + av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n"); return -1; /* NOTE: we only accept several full frames */ + } if (s->picture.data[0]) avctx->release_buffer(avctx, &s->picture); @@ -1281,7 +1288,7 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size, { DVVideoContext *s = c->priv_data; - s->sys = dv_codec_profile(c); + s->sys = ff_dv_codec_profile(c); if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) return -1; @@ -1321,7 +1328,7 @@ AVCodec dvvideo_encoder = { sizeof(DVVideoContext), dvvideo_init, dvvideo_encode_frame, - .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, + .pix_fmts = (const enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), }; #endif // CONFIG_DVVIDEO_ENCODER