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
Post a Comment