| 1487 | } |
| 1488 | |
| 1489 | static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count) |
| 1490 | { |
| 1491 | int16_t weight[8][64]; |
| 1492 | DCTELEM orig[8][64]; |
| 1493 | const int mb_x= s->mb_x; |
| 1494 | const int mb_y= s->mb_y; |
| 1495 | int i; |
| 1496 | int skip_dct[8]; |
| 1497 | int dct_offset = s->linesize*8; //default for progressive frames |
| 1498 | uint8_t *ptr_y, *ptr_cb, *ptr_cr; |
| 1499 | int wrap_y, wrap_c; |
| 1500 | |
| 1501 | for(i=0; i<mb_block_count; i++) skip_dct[i]=s->skipdct; |
| 1502 | |
| 1503 | if(s->adaptive_quant){ |
| 1504 | const int last_qp= s->qscale; |
| 1505 | const int mb_xy= mb_x + mb_y*s->mb_stride; |
| 1506 | |
| 1507 | s->lambda= s->lambda_table[mb_xy]; |
| 1508 | update_qscale(s); |
| 1509 | |
| 1510 | if(!(s->flags&CODEC_FLAG_QP_RD)){ |
| 1511 | s->qscale= s->current_picture_ptr->qscale_table[mb_xy]; |
| 1512 | s->dquant= s->qscale - last_qp; |
| 1513 | |
| 1514 | if(s->out_format==FMT_H263){ |
| 1515 | s->dquant= av_clip(s->dquant, -2, 2); |
| 1516 | |
| 1517 | if(s->codec_id==CODEC_ID_MPEG4){ |
| 1518 | if(!s->mb_intra){ |
| 1519 | if(s->pict_type == FF_B_TYPE){ |
| 1520 | if(s->dquant&1 || s->mv_dir&MV_DIRECT) |
| 1521 | s->dquant= 0; |
| 1522 | } |
| 1523 | if(s->mv_type==MV_TYPE_8X8) |
| 1524 | s->dquant=0; |
| 1525 | } |
| 1526 | } |
| 1527 | } |
| 1528 | } |
| 1529 | ff_set_qscale(s, last_qp + s->dquant); |
| 1530 | }else if(s->flags&CODEC_FLAG_QP_RD) |
| 1531 | ff_set_qscale(s, s->qscale + s->dquant); |
| 1532 | |
| 1533 | wrap_y = s->linesize; |
| 1534 | wrap_c = s->uvlinesize; |
| 1535 | ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16; |
| 1536 | ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8; |
| 1537 | ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8; |
| 1538 | |
| 1539 | if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ |
| 1540 | uint8_t *ebuf= s->edge_emu_buffer + 32; |
| 1541 | ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height); |
| 1542 | ptr_y= ebuf; |
| 1543 | ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
| 1544 | ptr_cb= ebuf+18*wrap_y; |
| 1545 | ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
| 1546 | ptr_cr= ebuf+18*wrap_y+8; |
no test coverage detected