You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
lavc decoders: work with refcounted frames.
This commit is contained in:
@@ -357,7 +357,7 @@ static int rv34_decode_intra_mb_header(RV34DecContext *r, int8_t *intra_types)
|
||||
|
||||
r->is16 = get_bits1(gb);
|
||||
if(r->is16){
|
||||
s->current_picture_ptr->f.mb_type[mb_pos] = MB_TYPE_INTRA16x16;
|
||||
s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA16x16;
|
||||
r->block_type = RV34_MB_TYPE_INTRA16x16;
|
||||
t = get_bits(gb, 2);
|
||||
fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, sizeof(intra_types[0]));
|
||||
@@ -367,7 +367,7 @@ static int rv34_decode_intra_mb_header(RV34DecContext *r, int8_t *intra_types)
|
||||
if(!get_bits1(gb))
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Need DQUANT\n");
|
||||
}
|
||||
s->current_picture_ptr->f.mb_type[mb_pos] = MB_TYPE_INTRA;
|
||||
s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA;
|
||||
r->block_type = RV34_MB_TYPE_INTRA;
|
||||
if(r->decode_intra_types(r, gb, intra_types) < 0)
|
||||
return -1;
|
||||
@@ -393,7 +393,7 @@ static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
|
||||
r->block_type = r->decode_mb_info(r);
|
||||
if(r->block_type == -1)
|
||||
return -1;
|
||||
s->current_picture_ptr->f.mb_type[mb_pos] = rv34_mb_type_to_lavc[r->block_type];
|
||||
s->current_picture_ptr->mb_type[mb_pos] = rv34_mb_type_to_lavc[r->block_type];
|
||||
r->mb_type[mb_pos] = r->block_type;
|
||||
if(r->block_type == RV34_MB_SKIP){
|
||||
if(s->pict_type == AV_PICTURE_TYPE_P)
|
||||
@@ -401,7 +401,7 @@ static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
|
||||
if(s->pict_type == AV_PICTURE_TYPE_B)
|
||||
r->mb_type[mb_pos] = RV34_MB_B_DIRECT;
|
||||
}
|
||||
r->is16 = !!IS_INTRA16x16(s->current_picture_ptr->f.mb_type[mb_pos]);
|
||||
r->is16 = !!IS_INTRA16x16(s->current_picture_ptr->mb_type[mb_pos]);
|
||||
rv34_decode_mv(r, r->block_type);
|
||||
if(r->block_type == RV34_MB_SKIP){
|
||||
fill_rectangle(intra_types, 4, 4, r->intra_types_stride, 0, sizeof(intra_types[0]));
|
||||
@@ -410,7 +410,7 @@ static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
|
||||
r->chroma_vlc = 1;
|
||||
r->luma_vlc = 0;
|
||||
|
||||
if(IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos])){
|
||||
if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
|
||||
if(r->is16){
|
||||
t = get_bits(gb, 2);
|
||||
fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, sizeof(intra_types[0]));
|
||||
@@ -475,27 +475,27 @@ static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int
|
||||
c_off = -1;
|
||||
|
||||
if(avail[-1]){
|
||||
A[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-1][0];
|
||||
A[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-1][1];
|
||||
A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0];
|
||||
A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1];
|
||||
}
|
||||
if(avail[-4]){
|
||||
B[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride][0];
|
||||
B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride][1];
|
||||
B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0];
|
||||
B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1];
|
||||
}else{
|
||||
B[0] = A[0];
|
||||
B[1] = A[1];
|
||||
}
|
||||
if(!avail[c_off-4]){
|
||||
if(avail[-4] && (avail[-1] || r->rv30)){
|
||||
C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride-1][0];
|
||||
C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride-1][1];
|
||||
C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0];
|
||||
C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1];
|
||||
}else{
|
||||
C[0] = A[0];
|
||||
C[1] = A[1];
|
||||
}
|
||||
}else{
|
||||
C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride+c_off][0];
|
||||
C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride+c_off][1];
|
||||
C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][0];
|
||||
C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][1];
|
||||
}
|
||||
mx = mid_pred(A[0], B[0], C[0]);
|
||||
my = mid_pred(A[1], B[1], C[1]);
|
||||
@@ -503,8 +503,8 @@ static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int
|
||||
my += r->dmv[dmv_no][1];
|
||||
for(j = 0; j < part_sizes_h[block_type]; j++){
|
||||
for(i = 0; i < part_sizes_w[block_type]; i++){
|
||||
s->current_picture_ptr->f.motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
s->current_picture_ptr->f.motion_val[0][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -555,25 +555,25 @@ static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir)
|
||||
int i, j;
|
||||
Picture *cur_pic = s->current_picture_ptr;
|
||||
const int mask = dir ? MB_TYPE_L1 : MB_TYPE_L0;
|
||||
int type = cur_pic->f.mb_type[mb_pos];
|
||||
int type = cur_pic->mb_type[mb_pos];
|
||||
|
||||
if((r->avail_cache[6-1] & type) & mask){
|
||||
A[0] = cur_pic->f.motion_val[dir][mv_pos - 1][0];
|
||||
A[1] = cur_pic->f.motion_val[dir][mv_pos - 1][1];
|
||||
A[0] = cur_pic->motion_val[dir][mv_pos - 1][0];
|
||||
A[1] = cur_pic->motion_val[dir][mv_pos - 1][1];
|
||||
has_A = 1;
|
||||
}
|
||||
if((r->avail_cache[6-4] & type) & mask){
|
||||
B[0] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride][0];
|
||||
B[1] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride][1];
|
||||
B[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][0];
|
||||
B[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][1];
|
||||
has_B = 1;
|
||||
}
|
||||
if(r->avail_cache[6-4] && (r->avail_cache[6-2] & type) & mask){
|
||||
C[0] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride + 2][0];
|
||||
C[1] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride + 2][1];
|
||||
C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][0];
|
||||
C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][1];
|
||||
has_C = 1;
|
||||
}else if((s->mb_x+1) == s->mb_width && (r->avail_cache[6-5] & type) & mask){
|
||||
C[0] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride - 1][0];
|
||||
C[1] = cur_pic->f.motion_val[dir][mv_pos - s->b8_stride - 1][1];
|
||||
C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][0];
|
||||
C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][1];
|
||||
has_C = 1;
|
||||
}
|
||||
|
||||
@@ -584,12 +584,12 @@ static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir)
|
||||
|
||||
for(j = 0; j < 2; j++){
|
||||
for(i = 0; i < 2; i++){
|
||||
cur_pic->f.motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
cur_pic->f.motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
}
|
||||
}
|
||||
if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD){
|
||||
ZERO8x2(cur_pic->f.motion_val[!dir][mv_pos], s->b8_stride);
|
||||
ZERO8x2(cur_pic->motion_val[!dir][mv_pos], s->b8_stride);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -606,27 +606,27 @@ static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir)
|
||||
int* avail = r->avail_cache + avail_indexes[0];
|
||||
|
||||
if(avail[-1]){
|
||||
A[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - 1][0];
|
||||
A[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - 1][1];
|
||||
A[0] = s->current_picture_ptr->motion_val[0][mv_pos - 1][0];
|
||||
A[1] = s->current_picture_ptr->motion_val[0][mv_pos - 1][1];
|
||||
}
|
||||
if(avail[-4]){
|
||||
B[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride][0];
|
||||
B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride][1];
|
||||
B[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride][0];
|
||||
B[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride][1];
|
||||
}else{
|
||||
B[0] = A[0];
|
||||
B[1] = A[1];
|
||||
}
|
||||
if(!avail[-4 + 2]){
|
||||
if(avail[-4] && (avail[-1])){
|
||||
C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride - 1][0];
|
||||
C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride - 1][1];
|
||||
C[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride - 1][0];
|
||||
C[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride - 1][1];
|
||||
}else{
|
||||
C[0] = A[0];
|
||||
C[1] = A[1];
|
||||
}
|
||||
}else{
|
||||
C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride + 2][0];
|
||||
C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride + 2][1];
|
||||
C[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride + 2][0];
|
||||
C[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride + 2][1];
|
||||
}
|
||||
mx = mid_pred(A[0], B[0], C[0]);
|
||||
my = mid_pred(A[1], B[1], C[1]);
|
||||
@@ -635,8 +635,8 @@ static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir)
|
||||
for(j = 0; j < 2; j++){
|
||||
for(i = 0; i < 2; i++){
|
||||
for(k = 0; k < 2; k++){
|
||||
s->current_picture_ptr->f.motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
s->current_picture_ptr->f.motion_val[k][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx;
|
||||
s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][1] = my;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -674,24 +674,24 @@ static inline void rv34_mc(RV34DecContext *r, const int block_type,
|
||||
|
||||
if(thirdpel){
|
||||
int chroma_mx, chroma_my;
|
||||
mx = (s->current_picture_ptr->f.motion_val[dir][mv_pos][0] + (3 << 24)) / 3 - (1 << 24);
|
||||
my = (s->current_picture_ptr->f.motion_val[dir][mv_pos][1] + (3 << 24)) / 3 - (1 << 24);
|
||||
lx = (s->current_picture_ptr->f.motion_val[dir][mv_pos][0] + (3 << 24)) % 3;
|
||||
ly = (s->current_picture_ptr->f.motion_val[dir][mv_pos][1] + (3 << 24)) % 3;
|
||||
chroma_mx = s->current_picture_ptr->f.motion_val[dir][mv_pos][0] / 2;
|
||||
chroma_my = s->current_picture_ptr->f.motion_val[dir][mv_pos][1] / 2;
|
||||
mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) / 3 - (1 << 24);
|
||||
my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) / 3 - (1 << 24);
|
||||
lx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) % 3;
|
||||
ly = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) % 3;
|
||||
chroma_mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2;
|
||||
chroma_my = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2;
|
||||
umx = (chroma_mx + (3 << 24)) / 3 - (1 << 24);
|
||||
umy = (chroma_my + (3 << 24)) / 3 - (1 << 24);
|
||||
uvmx = chroma_coeffs[(chroma_mx + (3 << 24)) % 3];
|
||||
uvmy = chroma_coeffs[(chroma_my + (3 << 24)) % 3];
|
||||
}else{
|
||||
int cx, cy;
|
||||
mx = s->current_picture_ptr->f.motion_val[dir][mv_pos][0] >> 2;
|
||||
my = s->current_picture_ptr->f.motion_val[dir][mv_pos][1] >> 2;
|
||||
lx = s->current_picture_ptr->f.motion_val[dir][mv_pos][0] & 3;
|
||||
ly = s->current_picture_ptr->f.motion_val[dir][mv_pos][1] & 3;
|
||||
cx = s->current_picture_ptr->f.motion_val[dir][mv_pos][0] / 2;
|
||||
cy = s->current_picture_ptr->f.motion_val[dir][mv_pos][1] / 2;
|
||||
mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] >> 2;
|
||||
my = s->current_picture_ptr->motion_val[dir][mv_pos][1] >> 2;
|
||||
lx = s->current_picture_ptr->motion_val[dir][mv_pos][0] & 3;
|
||||
ly = s->current_picture_ptr->motion_val[dir][mv_pos][1] & 3;
|
||||
cx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2;
|
||||
cy = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2;
|
||||
umx = cx >> 2;
|
||||
umy = cy >> 2;
|
||||
uvmx = (cx & 3) << 1;
|
||||
@@ -704,7 +704,7 @@ static inline void rv34_mc(RV34DecContext *r, const int block_type,
|
||||
if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME)) {
|
||||
/* wait for the referenced mb row to be finished */
|
||||
int mb_row = s->mb_y + ((yoff + my + 5 + 8 * height) >> 4);
|
||||
AVFrame *f = dir ? &s->next_picture_ptr->f : &s->last_picture_ptr->f;
|
||||
ThreadFrame *f = dir ? &s->next_picture_ptr->tf : &s->last_picture_ptr->tf;
|
||||
ff_thread_await_progress(f, mb_row, 0);
|
||||
}
|
||||
|
||||
@@ -853,11 +853,11 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type)
|
||||
switch(block_type){
|
||||
case RV34_MB_TYPE_INTRA:
|
||||
case RV34_MB_TYPE_INTRA16x16:
|
||||
ZERO8x2(s->current_picture_ptr->f.motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
return 0;
|
||||
case RV34_MB_SKIP:
|
||||
if(s->pict_type == AV_PICTURE_TYPE_P){
|
||||
ZERO8x2(s->current_picture_ptr->f.motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0);
|
||||
break;
|
||||
}
|
||||
@@ -865,23 +865,23 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type)
|
||||
//surprisingly, it uses motion scheme from next reference frame
|
||||
/* wait for the current mb row to be finished */
|
||||
if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
ff_thread_await_progress(&s->next_picture_ptr->f, FFMAX(0, s->mb_y-1), 0);
|
||||
ff_thread_await_progress(&s->next_picture_ptr->tf, FFMAX(0, s->mb_y-1), 0);
|
||||
|
||||
next_bt = s->next_picture_ptr->f.mb_type[s->mb_x + s->mb_y * s->mb_stride];
|
||||
next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride];
|
||||
if(IS_INTRA(next_bt) || IS_SKIP(next_bt)){
|
||||
ZERO8x2(s->current_picture_ptr->f.motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->f.motion_val[1][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->motion_val[1][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
}else
|
||||
for(j = 0; j < 2; j++)
|
||||
for(i = 0; i < 2; i++)
|
||||
for(k = 0; k < 2; k++)
|
||||
for(l = 0; l < 2; l++)
|
||||
s->current_picture_ptr->f.motion_val[l][mv_pos + i + j*s->b8_stride][k] = calc_add_mv(r, l, s->next_picture_ptr->f.motion_val[0][mv_pos + i + j*s->b8_stride][k]);
|
||||
s->current_picture_ptr->motion_val[l][mv_pos + i + j*s->b8_stride][k] = calc_add_mv(r, l, s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k]);
|
||||
if(!(IS_16X8(next_bt) || IS_8X16(next_bt) || IS_8X8(next_bt))) //we can use whole macroblock MC
|
||||
rv34_mc_2mv(r, block_type);
|
||||
else
|
||||
rv34_mc_2mv_skip(r);
|
||||
ZERO8x2(s->current_picture_ptr->f.motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
||||
break;
|
||||
case RV34_MB_P_16x16:
|
||||
case RV34_MB_P_MIX16x16:
|
||||
@@ -1149,7 +1149,7 @@ static int rv34_set_deblock_coef(RV34DecContext *r)
|
||||
MpegEncContext *s = &r->s;
|
||||
int hmvmask = 0, vmvmask = 0, i, j;
|
||||
int midx = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
||||
int16_t (*motion_val)[2] = &s->current_picture_ptr->f.motion_val[0][midx];
|
||||
int16_t (*motion_val)[2] = &s->current_picture_ptr->motion_val[0][midx];
|
||||
for(j = 0; j < 16; j += 8){
|
||||
for(i = 0; i < 2; i++){
|
||||
if(is_mv_diff_gt_3(motion_val + i, 1))
|
||||
@@ -1192,26 +1192,26 @@ static int rv34_decode_inter_macroblock(RV34DecContext *r, int8_t *intra_types)
|
||||
dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width;
|
||||
if(s->mb_x && dist)
|
||||
r->avail_cache[5] =
|
||||
r->avail_cache[9] = s->current_picture_ptr->f.mb_type[mb_pos - 1];
|
||||
r->avail_cache[9] = s->current_picture_ptr->mb_type[mb_pos - 1];
|
||||
if(dist >= s->mb_width)
|
||||
r->avail_cache[2] =
|
||||
r->avail_cache[3] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride];
|
||||
r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride];
|
||||
if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1)
|
||||
r->avail_cache[4] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride + 1];
|
||||
r->avail_cache[4] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1];
|
||||
if(s->mb_x && dist > s->mb_width)
|
||||
r->avail_cache[1] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride - 1];
|
||||
r->avail_cache[1] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1];
|
||||
|
||||
s->qscale = r->si.quant;
|
||||
cbp = cbp2 = rv34_decode_inter_mb_header(r, intra_types);
|
||||
r->cbp_luma [mb_pos] = cbp;
|
||||
r->cbp_chroma[mb_pos] = cbp >> 16;
|
||||
r->deblock_coefs[mb_pos] = rv34_set_deblock_coef(r) | r->cbp_luma[mb_pos];
|
||||
s->current_picture_ptr->f.qscale_table[mb_pos] = s->qscale;
|
||||
s->current_picture_ptr->qscale_table[mb_pos] = s->qscale;
|
||||
|
||||
if(cbp == -1)
|
||||
return -1;
|
||||
|
||||
if (IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos])){
|
||||
if (IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
|
||||
if(r->is16) rv34_output_i16x16(r, intra_types, cbp);
|
||||
else rv34_output_intra(r, intra_types, cbp);
|
||||
return 0;
|
||||
@@ -1294,21 +1294,21 @@ static int rv34_decode_intra_macroblock(RV34DecContext *r, int8_t *intra_types)
|
||||
dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width;
|
||||
if(s->mb_x && dist)
|
||||
r->avail_cache[5] =
|
||||
r->avail_cache[9] = s->current_picture_ptr->f.mb_type[mb_pos - 1];
|
||||
r->avail_cache[9] = s->current_picture_ptr->mb_type[mb_pos - 1];
|
||||
if(dist >= s->mb_width)
|
||||
r->avail_cache[2] =
|
||||
r->avail_cache[3] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride];
|
||||
r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride];
|
||||
if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1)
|
||||
r->avail_cache[4] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride + 1];
|
||||
r->avail_cache[4] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1];
|
||||
if(s->mb_x && dist > s->mb_width)
|
||||
r->avail_cache[1] = s->current_picture_ptr->f.mb_type[mb_pos - s->mb_stride - 1];
|
||||
r->avail_cache[1] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1];
|
||||
|
||||
s->qscale = r->si.quant;
|
||||
cbp = rv34_decode_intra_mb_header(r, intra_types);
|
||||
r->cbp_luma [mb_pos] = cbp;
|
||||
r->cbp_chroma[mb_pos] = cbp >> 16;
|
||||
r->deblock_coefs[mb_pos] = 0xFFFF;
|
||||
s->current_picture_ptr->f.qscale_table[mb_pos] = s->qscale;
|
||||
s->current_picture_ptr->qscale_table[mb_pos] = s->qscale;
|
||||
|
||||
if(cbp == -1)
|
||||
return -1;
|
||||
@@ -1444,7 +1444,7 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int
|
||||
r->loop_filter(r, s->mb_y - 2);
|
||||
|
||||
if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
ff_thread_report_progress(&s->current_picture_ptr->f,
|
||||
ff_thread_report_progress(&s->current_picture_ptr->tf,
|
||||
s->mb_y - 2, 0);
|
||||
|
||||
}
|
||||
@@ -1503,6 +1503,8 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
|
||||
if(!intra_vlcs[0].cbppattern[0].bits)
|
||||
rv34_init_tables();
|
||||
|
||||
avctx->internal->allocate_progress = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1520,6 +1522,7 @@ int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx)
|
||||
if ((err = rv34_decoder_alloc(r)) < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1563,24 +1566,26 @@ static int finish_frame(AVCodecContext *avctx, AVFrame *pict)
|
||||
{
|
||||
RV34DecContext *r = avctx->priv_data;
|
||||
MpegEncContext *s = &r->s;
|
||||
int got_picture = 0;
|
||||
int got_picture = 0, ret;
|
||||
|
||||
ff_er_frame_end(&s->er);
|
||||
ff_MPV_frame_end(s);
|
||||
s->mb_num_left = 0;
|
||||
|
||||
if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
|
||||
ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0);
|
||||
|
||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
|
||||
*pict = s->current_picture_ptr->f;
|
||||
if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0)
|
||||
return ret;
|
||||
ff_print_debug_info(s, s->current_picture_ptr);
|
||||
got_picture = 1;
|
||||
} else if (s->last_picture_ptr != NULL) {
|
||||
*pict = s->last_picture_ptr->f;
|
||||
if ((ret = av_frame_ref(pict, &s->last_picture_ptr->f)) < 0)
|
||||
return ret;
|
||||
ff_print_debug_info(s, s->last_picture_ptr);
|
||||
got_picture = 1;
|
||||
}
|
||||
if (got_picture)
|
||||
ff_print_debug_info(s, pict);
|
||||
|
||||
return got_picture;
|
||||
}
|
||||
@@ -1595,7 +1600,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
|
||||
MpegEncContext *s = &r->s;
|
||||
AVFrame *pict = data;
|
||||
SliceInfo si;
|
||||
int i;
|
||||
int i, ret;
|
||||
int slice_count;
|
||||
const uint8_t *slices_hdr = NULL;
|
||||
int last = 0;
|
||||
@@ -1604,7 +1609,8 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
|
||||
if (buf_size == 0) {
|
||||
/* special case for last picture */
|
||||
if (s->low_delay==0 && s->next_picture_ptr) {
|
||||
*pict = s->next_picture_ptr->f;
|
||||
if ((ret = av_frame_ref(pict, &s->next_picture_ptr->f)) < 0)
|
||||
return ret;
|
||||
s->next_picture_ptr = NULL;
|
||||
|
||||
*got_picture_ptr = 1;
|
||||
@@ -1761,7 +1767,10 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
|
||||
if(r->loop_filter)
|
||||
r->loop_filter(r, s->mb_height - 1);
|
||||
|
||||
*got_picture_ptr = finish_frame(avctx, pict);
|
||||
ret = finish_frame(avctx, pict);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*got_picture_ptr = ret;
|
||||
} else if (HAVE_THREADS &&
|
||||
(s->avctx->active_thread_type & FF_THREAD_FRAME)) {
|
||||
av_log(avctx, AV_LOG_INFO, "marking unfished frame as finished\n");
|
||||
@@ -1770,7 +1779,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
|
||||
ff_er_frame_end(&s->er);
|
||||
ff_MPV_frame_end(s);
|
||||
s->mb_num_left = 0;
|
||||
ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
|
||||
ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user