From 67606c31f41959589d46fbd9e845a2974a48e505 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Wed, 29 Aug 2012 15:06:31 +0300 Subject: avcenc: Prepend startcodes to output buffers This makes the encoder output data that is similar to what actual HW encoders output. This form is also what is expected by virtually every other component - the only exception seems to be stagefright's MPEG4Writer which happens to work with this format. This also makes the encoder's output work in other decoders when passing through directly. If feeding the encoded data straight through to a decoder (such as in the EncodeDecodeTest CTS test), the output from OMX.google.h264.encoder cannot be decoded by e.g. OMX.Nvidia.h264.decode on a Nexus 7 or OMX.SEC.avc.dec on a Galaxy S3. Change-Id: I6e16433a4a66936e3080723c8233681f53bd55e5 --- media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'media') diff --git a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp index 1d66120..4a21a3e 100644 --- a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp +++ b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp @@ -871,7 +871,13 @@ void SoftAVCEncoder::onQueueFilled(OMX_U32 portIndex) { CHECK(encoderStatus == AVCENC_SUCCESS || encoderStatus == AVCENC_NEW_IDR); dataLength = outHeader->nAllocLen; // Reset the output buffer length if (inHeader->nFilledLen > 0) { + if (outHeader->nAllocLen >= 4) { + memcpy(outPtr, "\x00\x00\x00\x01", 4); + outPtr += 4; + dataLength -= 4; + } encoderStatus = PVAVCEncodeNAL(mHandle, outPtr, &dataLength, &type); + dataLength = outPtr + dataLength - outHeader->pBuffer; if (encoderStatus == AVCENC_SUCCESS) { CHECK(NULL == PVAVCEncGetOverrunBuffer(mHandle)); } else if (encoderStatus == AVCENC_PICTURE_READY) { -- cgit v1.1