I tried to convert camera YUV data(NV21, got from onpreviewframe) to YUV420Semiplaner, and sent YUV420Semiplaner to mediacodec/mediamuxer for mp4 image. But I always found the size of inputBuffer was unexpected The following are my coding and logcat,
Mediacodec/Mediaformat configuration:
MediaCodecInfo codecInfo = selectCodec(MIME_TYPE_VIDEO);
int colorFormat = selectColorFormat(codecInfo, MIME_TYPE_VIDEO);
formatVideo = MediaFormat.createVideoFormat(video/avc, 1280, 720);
formatVideo.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
formatVideo.setInteger(MediaFormat.KEY_BIT_RATE, 6000000);
formatVideo.setInteger(MediaFormat.KEY_FRAME_RATE, 40);
formatVideo.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mVideoCodec = MediaCodec.createEncoderByType(video/avc);
mVideoCodec.configure(formatVideo, null,null,MediaCodec.CONFIGURE_FLAG_ENCODE);
camera setting is below. I captured yuv from onpreviewframe and sent to codec.
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPreviewSize(1280, 720);
@Override
public void onPreviewFrame(final byte[] sourceYUVData, Camera camera)
{
//sent sourceYUVData to Codec
mVideoCodecInput.setByteBufferVideo(buffer, isUsingFrontCamera, Input_endOfStream);
}
//sent YUV data to Mediacodec dequeueinputbuffer
public void setByteBufferVideo(byte[] buffer, boolean isUsingFrontCamera, boolean Input_endOfStream)
{
ByteBuffer[] inputBuffers = mVideoCodec.getInputBuffers();
videoInputBufferIndex = mVideoCodec.dequeueInputBuffer(-1);
if(videoInputBufferIndex>=0) {
ByteBuffer inputBuffer = inputBuffers[videoInputBufferIndex];
inputBuffer.clear();
if (VERBOSE) {
Log.w(TAG, put_v + "[put_v] buffer length = " + buffer.length + "; inputBuffer length =" + inputBuffer.capacity());
}
//skip following code
}
I used 1280 x 720, and found when colorformat was YUV420semiplanar, the mediacodec dequeueinputbuffer size was 1425408, instead of 1382400 (1280x720x3/2). However when colorformat was YUV420Planar, the dequeue inputbuffer size is 1382400.
logcat:
[put_v] buffer length = 1382400 ; inputBuffer length =1425408
Was the size correct or i got the wrong setting? If the size for YUV420Semiplanar was correct, could someone teach me how to convert NV21 to YUV420Semiplanar with the size? Thanks a lot.