MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / encode_frame

Function encode_frame

libavcodec/snowenc.c:1770–2088  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1768}
1769
1770static 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 }

Callers

nothing calls this directly

Calls 15

ff_alloc_packetFunction · 0.85
ff_init_range_encoderFunction · 0.85
ff_build_rac_statesFunction · 0.85
ff_rate_estimate_qscaleFunction · 0.85
qscale2qlogFunction · 0.85
ff_snow_frames_prepareFunction · 0.85
get_encode_bufferFunction · 0.85
ff_me_init_picFunction · 0.85
av_logFunction · 0.85
calculate_visual_weightFunction · 0.85
encode_headerFunction · 0.85

Tested by

no test coverage detected