void GetHeaders(DataPacket &packet) { if(!HeaderPacket.Num()) { mfxVideoParam header_query; memset(&header_query, 0, sizeof(header_query)); mfxU8 sps[100], pps[100]; mfxExtCodingOptionSPSPPS headers; memset(&headers, 0, sizeof(headers)); headers.Header.BufferId = MFX_EXTBUFF_CODING_OPTION_SPSPPS; headers.Header.BufferSz = sizeof(mfxExtCodingOptionSPSPPS); headers.SPSBuffer = sps; headers.SPSBufSize = 100; headers.PPSBuffer = pps; headers.PPSBufSize = 100; mfxExtBuffer *ext_buff[] = {(mfxExtBuffer*)&headers}; header_query.ExtParam = ext_buff; header_query.NumExtParam = 1; auto sts = enc->GetVideoParam(&header_query); BufferOutputSerializer headerOut(HeaderPacket); headerOut.OutputByte(0x17); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(1); headerOut.Serialize(sps+5, 3); headerOut.OutputByte(0xff); headerOut.OutputByte(0xe1); headerOut.OutputWord(htons(headers.SPSBufSize-4)); headerOut.Serialize(sps+4, headers.SPSBufSize-4); headerOut.OutputByte(1); headerOut.OutputWord(htons(headers.PPSBufSize-4)); headerOut.Serialize(pps+4, headers.PPSBufSize-4); } packet.lpPacket = HeaderPacket.Array(); packet.size = HeaderPacket.Num(); }
void GetHeaders(DataPacket &packet) { if(!HeaderPacket.Num()) { x264_nal_t *nalOut; int nalNum; x264_encoder_headers(x264, &nalOut, &nalNum); for(int i=0; i<nalNum; i++) { x264_nal_t &nal = nalOut[i]; if(nal.i_type == NAL_SPS) { BufferOutputSerializer headerOut(HeaderPacket); headerOut.OutputByte(0x17); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(1); headerOut.Serialize(nal.p_payload+5, 3); headerOut.OutputByte(0xff); headerOut.OutputByte(0xe1); headerOut.OutputWord(htons(nal.i_payload-4)); headerOut.Serialize(nal.p_payload+4, nal.i_payload-4); x264_nal_t &pps = nalOut[i+1]; //the PPS always comes after the SPS headerOut.OutputByte(1); headerOut.OutputWord(htons(pps.i_payload-4)); headerOut.Serialize(pps.p_payload+4, pps.i_payload-4); } } } packet.lpPacket = HeaderPacket.Array(); packet.size = HeaderPacket.Num(); }
void GetHeaders(DataPacket &packet) { if(!HeaderPacket.Num()) { IPCSignalledType<spspps_size> spspps((event_prefix + SPSPPS_SIZES).Array()); IPCSignalledArray<mfxU8> sps((event_prefix + SPS_BUFF).Array(), spspps->sps_size), pps((event_prefix + PPS_BUFF).Array(), spspps->pps_size); IPCWaiter spspps_waiter = process_waiter; spspps_waiter.push_back(spspps.signal_); if(!spspps_waiter.wait_for(2, INFINITE)) return; BufferOutputSerializer headerOut(HeaderPacket); headerOut.OutputByte(0x17); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(1); headerOut.Serialize(sps+5, 3); headerOut.OutputByte(0xff); headerOut.OutputByte(0xe1); headerOut.OutputWord(htons(spspps->sps_size-4)); headerOut.Serialize(sps+4, spspps->sps_size-4); headerOut.OutputByte(1); headerOut.OutputWord(htons(spspps->pps_size-4)); headerOut.Serialize(pps+4, spspps->pps_size-4); } packet.lpPacket = HeaderPacket.Array(); packet.size = HeaderPacket.Num(); }
void NVENCEncoder::GetHeaders(DataPacket &packet) { uint32_t outSize = 0; char tmpHeader[128]; NV_ENC_SEQUENCE_PARAM_PAYLOAD payload = { 0 }; payload.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER; payload.spsppsBuffer = tmpHeader; payload.inBufferSize = 128; payload.outSPSPPSPayloadSize = &outSize; NVENCSTATUS nvStatus = pNvEnc->nvEncGetSequenceParams(encoder, &payload); if (nvStatus != NV_ENC_SUCCESS) { NvLog(TEXT("nvEncGetSequenceParams failed with 0x%x"), nvStatus); packet.lpPacket = 0; packet.size = 0; return; } char *sps = tmpHeader; unsigned int i_sps = 4; while (tmpHeader[i_sps ] != 0x00 || tmpHeader[i_sps + 1] != 0x00 || tmpHeader[i_sps + 2] != 0x00 || tmpHeader[i_sps + 3] != 0x01) { i_sps += 1; if (i_sps >= outSize) { NvLog(TEXT("Invalid SPS/PPS")); return; } } char *pps = tmpHeader + i_sps; unsigned int i_pps = outSize - i_sps; headerPacket.Clear(); BufferOutputSerializer headerOut(headerPacket); headerOut.OutputByte(0x17); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(0); headerOut.OutputByte(1); headerOut.Serialize(sps + 5, 3); headerOut.OutputByte(0xff); headerOut.OutputByte(0xe1); headerOut.OutputWord(htons(i_sps - 4)); headerOut.Serialize(sps + 4, i_sps - 4); headerOut.OutputByte(1); headerOut.OutputWord(htons(i_pps - 4)); headerOut.Serialize(pps + 4, i_pps - 4); packet.size = headerPacket.Num(); packet.lpPacket = headerPacket.Array(); }