int main(int argc, char** argv) { IVideoEncoder *encoder = NULL; uint32_t maxOutSize = 0; EncodeInput* input; EncodeOutput* output; Encode_Status status; VideoFrameRawData inputBuffer; VideoEncOutputBuffer outputBuffer; int encodeFrameCount = 0; if (!process_cmdline(argc, argv)) return -1; DEBUG("inputFourcc: %.4s codec is %s", (char*)(&(inputFourcc)), codec); input = EncodeInput::create(inputFileName, inputFourcc, videoWidth, videoHeight); if (!input) { fprintf (stderr, "fail to init input stream\n"); return -1; } videoWidth = input->getWidth(); videoHeight = input->getHeight(); if (YAMI_FOURCC_P010 == input->getFourcc()) bitDepth = 10; output = EncodeOutput::create(outputFileName, videoWidth, videoHeight, codec); if (!output) { fprintf (stderr, "fail to init output stream\n"); delete input; return -1; } encoder = createVideoEncoder(output->getMimeType()); assert(encoder != NULL); NativeDisplay nativeDisplay; nativeDisplay.type = NATIVE_DISPLAY_DRM; nativeDisplay.handle = -1; encoder->setNativeDisplay(&nativeDisplay); //configure encoding parameters VideoParamsCommon encVideoParams; encVideoParams.size = sizeof(VideoParamsCommon); encoder->getParameters(VideoParamsTypeCommon, &encVideoParams); setEncoderParameters(&encVideoParams); encVideoParams.size = sizeof(VideoParamsCommon); encoder->setParameters(VideoParamsTypeCommon, &encVideoParams); // configure AVC encoding parameters VideoParamsAVC encVideoParamsAVC; if (!strcmp(output->getMimeType(), YAMI_MIME_H264)) { encVideoParamsAVC.size = sizeof(VideoParamsAVC); encoder->getParameters(VideoParamsTypeAVC, &encVideoParamsAVC); encVideoParamsAVC.idrInterval = idrInterval; encVideoParamsAVC.size = sizeof(VideoParamsAVC); encoder->setParameters(VideoParamsTypeAVC, &encVideoParamsAVC); } // configure VP9 encoding parameters VideoParamsVP9 encVideoParamsVP9; if (!strcmp(output->getMimeType(), YAMI_MIME_VP9)) { encoder->getParameters(VideoParamsTypeVP9, &encVideoParamsVP9); encVideoParamsVP9.referenceMode = referenceMode; encoder->setParameters(VideoParamsTypeVP9, &encVideoParamsVP9); } VideoConfigAVCStreamFormat streamFormat; streamFormat.size = sizeof(VideoConfigAVCStreamFormat); streamFormat.streamFormat = AVC_STREAM_FORMAT_ANNEXB; encoder->setParameters(VideoConfigTypeAVCStreamFormat, &streamFormat); status = encoder->start(); assert(status == ENCODE_SUCCESS); //init output buffer encoder->getMaxOutSize(&maxOutSize); #ifdef __BUILD_GET_MV__ uint32_t size; VideoEncMVBuffer MVBuffer; MVFp = fopen("feimv.bin","wb"); encoder->getMVBufferSize(&size); if (!createMVBuffer(&MVBuffer, size)) { fprintf (stderr, "fail to create MV buffer\n"); return -1; } #endif if (!createOutputBuffer(&outputBuffer, maxOutSize)) { fprintf (stderr, "fail to create output\n"); delete input; delete output; return -1; } uint64_t i = 0; while (!input->isEOS()) { memset(&inputBuffer, 0, sizeof(inputBuffer)); if (input->getOneFrameInput(inputBuffer)) { inputBuffer.timeStamp = i++; status = encoder->encode(&inputBuffer); ASSERT(status == ENCODE_SUCCESS); input->recycleOneFrameInput(inputBuffer); } else break; //get the output buffer do { #ifndef __BUILD_GET_MV__ status = encoder->getOutput(&outputBuffer, false); #else status = encoder->getOutput(&outputBuffer, &MVBuffer, false); #endif if (status == ENCODE_SUCCESS && output->write(outputBuffer.data, outputBuffer.dataSize)) { DEBUG("timeStamp(PTS) : " "%" PRIu64, outputBuffer.timeStamp); DEBUG("output data size %d", outputBuffer.dataSize); } #ifdef __BUILD_GET_MV__ if (status == ENCODE_SUCCESS) { fwrite(MVBuffer.data, MVBuffer.bufferSize, 1, MVFp); } #endif } while (status != ENCODE_BUFFER_NO_MORE); encodeFrameCount++; if (frameCount && encodeFrameCount >= frameCount) break; } // drain the output buffer encoder->flush(); do { #ifndef __BUILD_GET_MV__ status = encoder->getOutput(&outputBuffer, true); #else status = encoder->getOutput(&outputBuffer, &MVBuffer, true); #endif if (status == ENCODE_SUCCESS && output->write(outputBuffer.data, outputBuffer.dataSize)) { DEBUG("timeStamp(PTS) : " "%" PRIu64 "\n", outputBuffer.timeStamp); } #ifdef __BUILD_GET_MV__ if (status == ENCODE_SUCCESS) { fwrite(MVBuffer.data, MVBuffer.bufferSize, 1, MVFp); } #endif } while (status != ENCODE_BUFFER_NO_MORE); encoder->stop(); releaseVideoEncoder(encoder); free(outputBuffer.data); delete output; delete input; #ifdef __BUILD_GET_MV__ free(MVBuffer.data); fclose(MVFp); #endif fprintf(stderr, "encode done\n"); return 0; }
int main(int argc, char** argv) { IVideoEncoder *encoder = NULL; uint32_t maxOutSize = 0; EncodeInput* input; EncodeOutput* output; Encode_Status status; VideoFrameRawData inputBuffer; VideoEncOutputBuffer outputBuffer; int encodeFrameCount = 0; yamiTraceInit(); if (!process_cmdline(argc, argv)) return -1; DEBUG("inputFourcc: %.4s", &(inputFourcc)); input = EncodeInput::create(inputFileName, inputFourcc, videoWidth, videoHeight); if (!input) { fprintf (stderr, "fail to init input stream\n"); return -1; } videoWidth = input->getWidth(); videoHeight = input->getHeight(); output = EncodeOutput::create(outputFileName, videoWidth, videoHeight); if (!output) { fprintf (stderr, "fail to init ouput stream\n"); return -1; } encoder = createVideoEncoder(output->getMimeType()); assert(encoder != NULL); NativeDisplay nativeDisplay; nativeDisplay.type = NATIVE_DISPLAY_DRM; nativeDisplay.handle = -1; encoder->setNativeDisplay(&nativeDisplay); //configure encoding parameters VideoParamsCommon encVideoParams; encVideoParams.size = sizeof(VideoParamsCommon); encoder->getParameters(VideoParamsTypeCommon, &encVideoParams); setEncoderParameters(&encVideoParams); encVideoParams.size = sizeof(VideoParamsCommon); encoder->setParameters(VideoParamsTypeCommon, &encVideoParams); VideoConfigAVCStreamFormat streamFormat; streamFormat.size = sizeof(VideoConfigAVCStreamFormat); streamFormat.streamFormat = AVC_STREAM_FORMAT_ANNEXB; encoder->setParameters(VideoConfigTypeAVCStreamFormat, &streamFormat); status = encoder->start(); assert(status == ENCODE_SUCCESS); //init output buffer encoder->getMaxOutSize(&maxOutSize); if (!createOutputBuffer(&outputBuffer, maxOutSize)) { fprintf (stderr, "fail to create output\n"); return -1; } while (!input->isEOS()) { memset(&inputBuffer, 0, sizeof(inputBuffer)); if (input->getOneFrameInput(inputBuffer)) { status = encoder->encode(&inputBuffer); ASSERT(status == ENCODE_SUCCESS); input->recycleOneFrameInput(inputBuffer); } else break; //get the output buffer do { status = encoder->getOutput(&outputBuffer, false); if (status == ENCODE_SUCCESS && !output->write(outputBuffer.data, outputBuffer.dataSize)) assert(0); } while (status != ENCODE_BUFFER_NO_MORE); if (frameCount && encodeFrameCount++ > frameCount) break; } // drain the output buffer do { status = encoder->getOutput(&outputBuffer, true); if (status == ENCODE_SUCCESS && !output->write(outputBuffer.data, outputBuffer.dataSize)) assert(0); } while (status != ENCODE_BUFFER_NO_MORE); encoder->stop(); releaseVideoEncoder(encoder); free(outputBuffer.data); delete output; fprintf(stderr, "encode done\n"); return 0; }