//#include <assert.h>
static int encode_picture(MpegEncContext *s, int picture_number);
-static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
+static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
static int sse_mb(MpegEncContext *s);
-static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
-static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
+static void denoise_dct_c(MpegEncContext *s, int16_t *block);
+static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow);
//#define DEBUG
}
}
-static void copy_picture_attributes(MpegEncContext *s,
- AVFrame *dst,
- AVFrame *src)
+static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst,
+ const AVFrame *src)
{
int i;
}
-static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg)
+static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
{
AVFrame *pic = NULL;
int64_t pts;
- int i;
+ int i, display_picture_number = 0;
const int encoding_delay = s->max_b_frames ? s->max_b_frames :
(s->low_delay ? 0 : 1);
int direct = 1;
if (pic_arg) {
pts = pic_arg->pts;
- pic_arg->display_picture_number = s->input_picture_number++;
+ display_picture_number = s->input_picture_number++;
if (pts != AV_NOPTS_VALUE) {
if (s->user_specified_pts != AV_NOPTS_VALUE) {
return -1;
}
- if (!s->low_delay && pic_arg->display_picture_number == 1)
+ if (!s->low_delay && display_picture_number == 1)
s->dts_delta = time - last;
}
s->user_specified_pts = pts;
"Warning: AVFrame.pts=? trying to guess (%"PRId64")\n",
pts);
} else {
- pts = pic_arg->display_picture_number;
+ pts = display_picture_number;
}
}
}
- if (pic_arg) {
- if (encoding_delay && !(s->flags & CODEC_FLAG_INPUT_PRESERVED))
- direct = 0;
- if (pic_arg->linesize[0] != s->linesize)
- direct = 0;
- if (pic_arg->linesize[1] != s->uvlinesize)
- direct = 0;
- if (pic_arg->linesize[2] != s->uvlinesize)
- direct = 0;
-
- av_dlog(s->avctx, "%d %d %d %d\n", pic_arg->linesize[0],
- pic_arg->linesize[1], s->linesize, s->uvlinesize);
-
- if (direct) {
- i = ff_find_unused_picture(s, 1);
- if (i < 0)
- return i;
+ if (pic_arg) {
+ if (encoding_delay && !(s->flags & CODEC_FLAG_INPUT_PRESERVED))
+ direct = 0;
+ if (pic_arg->linesize[0] != s->linesize)
+ direct = 0;
+ if (pic_arg->linesize[1] != s->uvlinesize)
+ direct = 0;
+ if (pic_arg->linesize[2] != s->uvlinesize)
+ direct = 0;
+
+ av_dlog(s->avctx, "%d %d %d %d\n", pic_arg->linesize[0],
+ pic_arg->linesize[1], s->linesize, s->uvlinesize);
+
+ if (direct) {
+ i = ff_find_unused_picture(s, 1);
+ if (i < 0)
+ return i;
- pic = &s->picture[i].f;
- pic->reference = 3;
+ pic = &s->picture[i].f;
+ pic->reference = 3;
- for (i = 0; i < 4; i++) {
- pic->data[i] = pic_arg->data[i];
- pic->linesize[i] = pic_arg->linesize[i];
- }
- if (ff_alloc_picture(s, (Picture *) pic, 1) < 0) {
- return -1;
- }
- } else {
- i = ff_find_unused_picture(s, 0);
- if (i < 0)
- return i;
+ for (i = 0; i < 4; i++) {
+ pic->data[i] = pic_arg->data[i];
+ pic->linesize[i] = pic_arg->linesize[i];
+ }
+ if (ff_alloc_picture(s, (Picture *) pic, 1) < 0) {
+ return -1;
+ }
+ } else {
+ i = ff_find_unused_picture(s, 0);
+ if (i < 0)
+ return i;
- pic = &s->picture[i].f;
- pic->reference = 3;
+ pic = &s->picture[i].f;
+ pic->reference = 3;
- if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) {
- return -1;
- }
+ if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) {
+ return -1;
+ }
- if (pic->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
- pic->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
- pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
- // empty
- } else {
- int h_chroma_shift, v_chroma_shift;
- avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
-
- for (i = 0; i < 3; i++) {
- int src_stride = pic_arg->linesize[i];
- int dst_stride = i ? s->uvlinesize : s->linesize;
- int h_shift = i ? h_chroma_shift : 0;
- int v_shift = i ? v_chroma_shift : 0;
- int w = s->width >> h_shift;
- int h = s->height >> v_shift;
- uint8_t *src = pic_arg->data[i];
- uint8_t *dst = pic->data[i];
-
- if(s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)){
- h= ((s->height+15)/16*16)>>v_shift;
- }
+ if (pic->data[0] + INPLACE_OFFSET == pic_arg->data[0] &&
+ pic->data[1] + INPLACE_OFFSET == pic_arg->data[1] &&
+ pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]) {
+ // empty
+ } else {
+ int h_chroma_shift, v_chroma_shift;
+ av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt,
+ &h_chroma_shift,
+ &v_chroma_shift);
+
+ for (i = 0; i < 3; i++) {
+ int src_stride = pic_arg->linesize[i];
+ int dst_stride = i ? s->uvlinesize : s->linesize;
+ int h_shift = i ? h_chroma_shift : 0;
+ int v_shift = i ? v_chroma_shift : 0;
+ int w = s->width >> h_shift;
+ int h = s->height >> v_shift;
+ uint8_t *src = pic_arg->data[i];
+ uint8_t *dst = pic->data[i];
+
+ if (s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)) {
+ h = ((s->height + 15)/16*16) >> v_shift;
+ }
- if (!s->avctx->rc_buffer_size)
- dst += INPLACE_OFFSET;
+ if (!s->avctx->rc_buffer_size)
+ dst += INPLACE_OFFSET;
- if (src_stride == dst_stride)
- memcpy(dst, src, src_stride * h);
- else {
- while (h--) {
- memcpy(dst, src, w);
- dst += dst_stride;
- src += src_stride;
+ if (src_stride == dst_stride)
+ memcpy(dst, src, src_stride * h);
+ else {
+ while (h--) {
+ memcpy(dst, src, w);
+ dst += dst_stride;
+ src += src_stride;
+ }
}
}
}
}
+ copy_picture_attributes(s, pic, pic_arg);
+ pic->display_picture_number = display_picture_number;
+ pic->pts = pts; // we set this here to avoid modifiying pic_arg
}
- copy_picture_attributes(s, pic, pic_arg);
- pic->pts = pts; // we set this here to avoid modifiying pic_arg
- }
/* shift buffer entries */
for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
int score = 0;
int run = 0;
int i;
- DCTELEM *block = s->block[n];
+ int16_t *block = s->block[n];
const int last_index = s->block_last_index[n];
int skip_dc;
s->block_last_index[n] = -1;
}
-static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block,
+static inline void clip_coeffs(MpegEncContext *s, int16_t *block,
int last_index)
{
int i;
int mb_block_count)
{
int16_t weight[12][64];
- DCTELEM orig[12][64];
+ int16_t orig[12][64];
const int mb_x = s->mb_x;
const int mb_y = s->mb_y;
int i;
get_visual_weight(weight[7], ptr_cr + uv_dct_offset,
wrap_c);
}
- memcpy(orig[0], s->block[0], sizeof(DCTELEM) * 64 * mb_block_count);
+ memcpy(orig[0], s->block[0], sizeof(int16_t) * 64 * mb_block_count);
}
/* DCT & quantize */
if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
const int last_qp= backup_s.qscale;
int qpi, qp, dc[6];
- DCTELEM ac[6][16];
+ int16_t ac[6][16];
const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
static const int dquant_tab[4]={-1,1,-2,2};
+ int storecoefs = s->mb_intra && s->dc_val[0];
av_assert2(backup_s.dquant == 0);
if(qp < s->avctx->qmin || qp > s->avctx->qmax)
continue;
backup_s.dquant= dquant;
- if(s->mb_intra && s->dc_val[0]){
+ if(storecoefs){
for(i=0; i<6; i++){
dc[i]= s->dc_val[0][ s->block_index[i] ];
- memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
+ memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(int16_t)*16);
}
}
encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
&dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
if(best_s.qscale != qp){
- if(s->mb_intra && s->dc_val[0]){
+ if(storecoefs){
for(i=0; i<6; i++){
s->dc_val[0][ s->block_index[i] ]= dc[i];
- memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
+ memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(int16_t)*16);
}
}
}
return 0;
}
-static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
+static void denoise_dct_c(MpegEncContext *s, int16_t *block){
const int intra= s->mb_intra;
int i;
}
static int dct_quantize_trellis_c(MpegEncContext *s,
- DCTELEM *block, int n,
+ int16_t *block, int n,
int qscale, int *overflow){
const int *qmat;
const uint8_t *scantable= s->intra_scantable.scantable;
*overflow= s->max_qcoeff < max; //overflow might have happened
if(last_non_zero < start_i){
- memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
+ memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
return last_non_zero;
}
dc= FFABS(block[0]);
last_non_zero= last_i - 1;
- memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
+ memset(block + start_i, 0, (64-start_i)*sizeof(int16_t));
if(last_non_zero < start_i)
return last_non_zero;
}
static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
- DCTELEM *block, int16_t *weight, DCTELEM *orig,
+ int16_t *block, int16_t *weight, int16_t *orig,
int n, int qscale){
int16_t rem[64];
- LOCAL_ALIGNED_16(DCTELEM, d1, [64]);
+ LOCAL_ALIGNED_16(int16_t, d1, [64]);
const uint8_t *scantable= s->intra_scantable.scantable;
const uint8_t *perm_scantable= s->intra_scantable.permutated;
// unsigned int threshold1, threshold2;
}
int ff_dct_quantize_c(MpegEncContext *s,
- DCTELEM *block, int n,
+ int16_t *block, int n,
int qscale, int *overflow)
{
int i, j, level, last_non_zero, q, start_i;