/** \fn encode */ bool ADM_jpegEncoder::encode (ADMBitstream * out) { if(false==preEncode()) return false; _context->flags |= CODEC_FLAG_QSCALE; _frame.quality = (int) floor (FF_QP2LAMBDA * jpegConf.quantizer+ 0.5); int sz=0; if ((sz = avcodec_encode_video (_context, out->data, out->bufferSize, &_frame)) < 0) { ADM_error("[jpeg] Error %d encoding video\n",sz); return false; } out->len=sz; out->pts=out->dts=image->Pts; out->flags=AVI_KEY_FRAME; return true; }
/** \fn encode */ bool ADM_ffVAEncHEVC::encode (ADMBitstream * out) { int sz,q; again: sz=0; if(false==preEncode()) // Pop - out the frames stored in the queue due to B-frames { sz=encodeWrapper(NULL,out); if (sz<= 0) { if(sz<0) ADM_info("[ffVAEncHEVC] Error %d encoding video\n",sz); return false; } ADM_info("[ffVAEncHEVC] Popping delayed bframes (%d)\n",sz); goto link; return false; } q=image->_Qp; if(!q) q=2; aprintf("[CODEC] Flags=%#x, QSCALE=%x, bit_rate=%d, quality=%d, qz=%d, incoming qz=%d\n", _context->flags, AV_CODEC_FLAG_QSCALE, _context->bit_rate, hwFrame->quality, hwFrame->quality / FF_QP2LAMBDA, q); hwFrame->reordered_opaque=image->Pts; sz=encodeWrapper(hwFrame,out); if(sz<0) { CLEARTEXT(sz) ADM_warning("[ffVAEncHEVC] Error %d (%s) encoding video\n",sz,buf); return false; } if(sz==0) // no pic, probably pre filling, try again goto again; aprintf("[ffVAEncHEVC] encoder produces %d bytes\n",sz); link: return postEncode(out,sz); }
/** \fn encode */ bool ADM_ffMpeg2Encoder::encode (ADMBitstream * out) { int sz,q; int gotData; int r; again: sz=0; if(false==preEncode()) // Pop - out the frames stored in the queue due to B-frames { AVPacket pkt; av_init_packet(&pkt); pkt.data=out->data; pkt.size=out->bufferSize; r=encodeWrapper(NULL,out); if(r<0) { ADM_warning("[ffMpeg2] Error %d encoding video\n",r); return false; } sz=r; ADM_info("[ffMpeg2] Popping delayed bframes (%d)\n",sz); goto link; return false; } q=image->_Qp; if(!q) q=2; switch(Settings.params.mode) { case COMPRESS_SAME: // Keep same frame type & same Qz as the incoming frame... _frame->quality = (int) floor (FF_QP2LAMBDA * q+ 0.5); if(image->flags & AVI_KEY_FRAME) _frame->pict_type = AV_PICTURE_TYPE_I; else if(image->flags & AVI_B_FRAME) _frame->pict_type = AV_PICTURE_TYPE_B; else _frame->pict_type = AV_PICTURE_TYPE_P; break; case COMPRESS_2PASS: case COMPRESS_2PASS_BITRATE: switch(pass) { case 1: break; case 2: break; // Get Qz for this frame... } case COMPRESS_CQ: _frame->quality = (int) floor (FF_QP2LAMBDA * Settings.params.qz+ 0.5); break; case COMPRESS_CBR: break; default: printf("[ffMpeg2] Unsupported encoding mode\n"); return false; } aprintf("[CODEC] Flags = 0x%x, QSCALE=%x, bit_rate=%d, quality=%d qz=%d incoming qz=%d\n",_context->flags,CODEC_FLAG_QSCALE, _context->bit_rate, _frame->quality, _frame->quality/ FF_QP2LAMBDA,q); _frame->reordered_opaque=image->Pts; r=encodeWrapper(_frame,out); if(r<0) { ADM_warning("[ffMpeg2] Error %d encoding video\n",r); return false; } sz=r; if(sz==0) // no pic, probably pre filling, try again goto again; link: return postEncode(out,sz); }