diff options
Diffstat (limited to 'libavcodec/dvenc.c')
-rw-r--r-- | libavcodec/dvenc.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c index 9f458e3e47..aeb4a33259 100644 --- a/libavcodec/dvenc.c +++ b/libavcodec/dvenc.c @@ -2,20 +2,20 @@ * DV encoder * Copyright (c) 2003 Roman Shaposhnik * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -53,6 +53,10 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx) ff_dv_print_profiles(avctx, AV_LOG_ERROR); return AVERROR(EINVAL); } + if (avctx->height > 576) { + av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n"); + return AVERROR_PATCHWELCOME; + } ret = ff_dv_init_dynamic_tables(s, s->sys); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n"); @@ -65,6 +69,7 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx) dv_vlc_map_tableinit(); + memset(&dsp,0, sizeof(dsp)); ff_dsputil_init(&dsp, avctx); ff_fdctdsp_init(&fdsp, avctx); ff_pixblockdsp_init(&pdsp, avctx); @@ -240,7 +245,7 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, i method suggested in SMPTE 314M Table 22, and an improved method. The SMPTE method is very conservative; it assigns class 3 (i.e. severe quantization) to any block where the largest AC - component is greater than 36. Libav's DV encoder tracks AC bit + component is greater than 36. FFmpeg's DV encoder tracks AC bit consumption precisely, so there is no need to bias most blocks towards strongly lossy compression. Instead, we assign class 2 to most blocks, and use class 3 only when strictly necessary @@ -248,13 +253,13 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, i #if 0 /* SMPTE spec method */ static const int classes[] = {12, 24, 36, 0xffff}; -#else /* improved Libav method */ +#else /* improved FFmpeg method */ static const int classes[] = {-1, -1, 255, 0xffff}; #endif int max = classes[0]; int prev = 0; - assert((((int)blk) & 15) == 0); + av_assert2((((int)blk) & 15) == 0); bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0; bi->partial_bit_count = 0; @@ -283,7 +288,7 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, i if (level + 15 > 30U) { bi->sign[i] = (level >> 31) & 1; - /* weight it and and shift down into range, adding for rounding */ + /* weight it and shift down into range, adding for rounding */ /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT AND the 2x doubling of the weights */ level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4); @@ -345,7 +350,7 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos) b->bit_size[a] = 1; // 4 areas 4 bits for EOB :) b->area_q[a]++; prev = b->prev[a]; - assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]); + av_assert2(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]); for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) { b->mb[k] >>= 1; if (b->mb[k]) { @@ -355,11 +360,11 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos) if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){ for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++) b->prev[a2] = prev; - assert(a2 < 4); - assert(b->mb[b->next[k]]); + av_assert2(a2 < 4); + av_assert2(b->mb[b->next[k]]); b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]); - assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k)); + av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k)); b->prev[a2] = prev; } b->next[prev] = b->next[k]; @@ -546,6 +551,7 @@ static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, * compression scheme (if any). */ int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1); + int fs = c->frame->top_field_first ? 0x00 : 0x40; uint8_t aspect = 0; if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */ @@ -584,7 +590,7 @@ static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, buf[2] = 0xc8 | /* reserved -- always b11001xxx */ aspect; buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */ - (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */ + fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */ (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */ (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */ 0xc; /* reserved -- always b1100 */ @@ -687,10 +693,8 @@ static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt, DVVideoContext *s = c->priv_data; int ret; - if ((ret = ff_alloc_packet(pkt, s->sys->frame_size)) < 0) { - av_log(c, AV_LOG_ERROR, "Error getting output packet.\n"); + if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0) return ret; - } c->pix_fmt = s->sys->pix_fmt; s->frame = frame; |