| 1768 | } |
| 1769 | |
| 1770 | static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
| 1771 | const AVFrame *pict, int *got_packet) |
| 1772 | { |
| 1773 | SnowEncContext *const enc = avctx->priv_data; |
| 1774 | SnowContext *const s = &enc->com; |
| 1775 | MPVEncContext *const mpv = &enc->m.s; |
| 1776 | RangeCoder * const c= &s->c; |
| 1777 | AVCodecInternal *avci = avctx->internal; |
| 1778 | AVFrame *pic; |
| 1779 | const int width= s->avctx->width; |
| 1780 | const int height= s->avctx->height; |
| 1781 | int level, orientation, plane_index, i, y, ret; |
| 1782 | uint8_t rc_header_bak[sizeof(s->header_state)]; |
| 1783 | uint8_t rc_block_bak[sizeof(s->block_state)]; |
| 1784 | |
| 1785 | if ((ret = ff_alloc_packet(avctx, pkt, s->b_width*s->b_height*MB_SIZE*MB_SIZE*3 + FF_INPUT_BUFFER_MIN_SIZE)) < 0) |
| 1786 | return ret; |
| 1787 | |
| 1788 | ff_init_range_encoder(c, pkt->data, pkt->size); |
| 1789 | ff_build_rac_states(c, (1LL<<32)/20, 256-8); |
| 1790 | |
| 1791 | for(i=0; i < s->nb_planes; i++){ |
| 1792 | int hshift= i ? s->chroma_h_shift : 0; |
| 1793 | int vshift= i ? s->chroma_v_shift : 0; |
| 1794 | for(y=0; y<AV_CEIL_RSHIFT(height, vshift); y++) |
| 1795 | memcpy(&s->input_picture->data[i][y * s->input_picture->linesize[i]], |
| 1796 | &pict->data[i][y * pict->linesize[i]], |
| 1797 | AV_CEIL_RSHIFT(width, hshift)); |
| 1798 | enc->mpvencdsp.draw_edges(s->input_picture->data[i], s->input_picture->linesize[i], |
| 1799 | AV_CEIL_RSHIFT(width, hshift), AV_CEIL_RSHIFT(height, vshift), |
| 1800 | EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift, |
| 1801 | EDGE_TOP | EDGE_BOTTOM); |
| 1802 | |
| 1803 | } |
| 1804 | pic = s->input_picture; |
| 1805 | pic->pict_type = pict->pict_type; |
| 1806 | pic->quality = pict->quality; |
| 1807 | |
| 1808 | mpv->picture_number = avctx->frame_num; |
| 1809 | if(avctx->flags&AV_CODEC_FLAG_PASS2){ |
| 1810 | mpv->c.pict_type = pic->pict_type = enc->m.rc_context.entry[avctx->frame_num].new_pict_type; |
| 1811 | s->keyframe = pic->pict_type == AV_PICTURE_TYPE_I; |
| 1812 | if(!(avctx->flags&AV_CODEC_FLAG_QSCALE)) { |
| 1813 | pic->quality = ff_rate_estimate_qscale(&enc->m, 0); |
| 1814 | if (pic->quality < 0) |
| 1815 | return -1; |
| 1816 | } |
| 1817 | }else{ |
| 1818 | s->keyframe= avctx->gop_size==0 || avctx->frame_num % avctx->gop_size == 0; |
| 1819 | mpv->c.pict_type = pic->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; |
| 1820 | } |
| 1821 | |
| 1822 | if (enc->pass1_rc && avctx->frame_num == 0) |
| 1823 | pic->quality = 2*FF_QP2LAMBDA; |
| 1824 | if (pic->quality) { |
| 1825 | s->qlog = qscale2qlog(pic->quality); |
| 1826 | enc->lambda = pic->quality * 3/2; |
| 1827 | } |
nothing calls this directly
no test coverage detected