c++ - OSX, VideoToolbox, Compression Session -


environment

  • osx yosemite
  • xcode 6.4
  • c++

use-case

given h264 gop consisting of single key-frame , multiple corresponding delta frames, decode gop, , then, encode single 4.2mbit key-frame

problem description

i able decode gop , encode key-frame, however, resulting key-frame of low quality ( low bit-rate ), is, although set bit-rate 4.2mbit ( can seen in code snap bellow ), having in mind need single key-frame, there way setup videotoolbox encoder output high bit-rate key-frame ?

const cmvideocodectype  fourcc  = (cmvideocodectype)cmvideoformatdescriptiongetcodectype(fmt);  // else, generate h264 keyframe  cfobjectsmartptr< cfmutabledictionaryref >  dictencspec; dictencspec.attach(cfdictionarycreatemutable(null, 0, &kcftypedictionarykeycallbacks, &kcftypedictionaryvaluecallbacks)); //dictencspec.attach(cfdictionarycreatemutable(null, 0, 0, 0)); // cfdictionarysetnumval(dictencspec, kvtvideoencoderspecification_requirehardwareacceleratedvideoencoder, true); cfdictionarysetvalue(dictencspec, kvtcompressionpropertykey_profilelevel, kvtprofilelevel_h264_high_3_2); // cfdictionarysetvalue(dictencspec, kvtcompressionpropertykey_realtime, kcfbooleantrue);  // cfdictionarysetvalue(dictencspec, kvtcompressionpropertykey_h264entropymode, kvth264entropymode_cabac);  cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_averagebitrate, 4200000); cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_quality, 1.0f); cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_maxframedelaycount, 0); cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_maxkeyframeintervalduration, 1); cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_expectedduration, 1); cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_expectedframerate, 10); // cfdictionarysetnumval(dictencspec, kvtcompressionpropertykey_sourceframecount, 1); cfdictionarysetnumval(dictencspec, kvtvideoencoderspecification_enablehardwareacceleratedvideoencoder, true);  cfobjectsmartptr< vtcompressionsessionref > sessioncompression; status = vtcompressionsessioncreate(0, res.width, res.height, fourcc, (cfdictionaryref)dictencspec, 0, 0, compressioncallback, &ctx, &sessioncompression); if (noerr != status)     return hresult_from_errno(status); if (noerr != (status = vtcompressionsessionencodeframe(sessioncompression, ctx.yuvframe, timestamp, timestamp, 0, 0, 0)))     return hresult_from_errno(status); if(noerr != (status = vtcompressionsessioncompleteframes(sessioncompression, timestamp)))     return hresult_from_errno(status); if (0 == ctx.keyframe) {     assert(false);     return e_unexpected; } 

ctx.keyframe ends of low quality


Comments

Popular posts from this blog

Fail to load namespace Spring Security http://www.springframework.org/security/tags -

sql - MySQL query optimization using coalesce -

Maven Javadoc 'Cannot find default setter' and fails -