ASDCP::Result_t ASDCP::JP2K::SequenceParser::h__SequenceParser::ReadFrame(FrameBuffer& FB) { if ( m_CurrentFile == m_FileList.end() ) return RESULT_ENDOFFILE; // open the file Result_t result = m_Parser.OpenReadFrame((*m_CurrentFile).c_str(), FB); if ( ASDCP_SUCCESS(result) && m_Pedantic ) { PictureDescriptor PDesc; result = m_Parser.FillPictureDescriptor(PDesc); if ( ASDCP_SUCCESS(result) && ! ( m_PDesc == PDesc ) ) { Kumu::DefaultLogSink().Error("JPEG-2000 codestream parameters do not match at frame %d\n", m_FramesRead + 1); result = RESULT_RAW_FORMAT; } } if ( ASDCP_SUCCESS(result) ) { FB.FrameNumber(m_FramesRead++); m_CurrentFile++; } return result; }
ASDCP::Result_t ASDCP::PCM::AtmosSyncChannelGenerator::ReadFrame(FrameBuffer& OutFB) { if (OutFB.Capacity() < m_numBytesPerFrame) { return RESULT_SMALLBUF; } /** * Update frame number and size. */ OutFB.FrameNumber(m_currentFrameNumber); OutFB.Size(m_numBytesPerFrame); /** * Get pointer to frame essence. */ byte_t* frameEssence = OutFB.Data(); if (m_isSyncEncoderInitialized) { /** * Generate sync signal frame. */ int ret = EncodeSync(&m_syncEncoder, m_numSamplesPerFrame, m_syncSignalBuffer, m_currentFrameNumber); if (ret == SYNC_ENCODER_ERROR_NONE) { for (unsigned int i = 0; i < m_numSamplesPerFrame; ++i) { /** * Convert each encoded float sample to a signed 24 bit integer and * copy into the essence buffer. */ i32_t sample = convertSampleFloatToInt24(m_syncSignalBuffer[i]); memcpy(frameEssence, ((byte_t*)(&sample))+1, NUM_BYTES_PER_INT24); frameEssence += NUM_BYTES_PER_INT24; } } else { /** * Encoding error, zero out the frame. */ memset(frameEssence, 0, m_numBytesPerFrame); } } else { /** * Sync encoder not initialize, zero out the frame. */ memset(frameEssence, 0, m_numBytesPerFrame); } ++m_currentFrameNumber; return RESULT_OK; }
ASDCP::Result_t ASDCP::DCData::SequenceParser::h__SequenceParser::ReadFrame(FrameBuffer& FB) { if ( m_CurrentFile == m_FileList.end() ) return RESULT_ENDOFFILE; // open the file Result_t result = m_Parser.OpenReadFrame((*m_CurrentFile).c_str(), FB); if ( ASDCP_SUCCESS(result) ) { FB.FrameNumber(m_FramesRead++); m_CurrentFile++; } return result; }
ASDCP::Result_t ASDCP::MPEG2::Parser::h__Parser::ReadFrame(FrameBuffer& FB) { Result_t result = RESULT_OK; ui32_t write_offset = 0; ui32_t read_count = 0; FB.Size(0); if ( m_EOF ) return RESULT_ENDOFFILE; // Data is read in VESReadSize chunks. Each chunk is parsed, and the // process is stopped when a Sequence or Picture header is found or when // the input file is exhausted. The partial next frame is cached for the // next call. m_ParserDelegate.Reset(); m_Parser.Reset(); if ( m_TmpBuffer.Size() > 0 ) { memcpy(FB.Data(), m_TmpBuffer.RoData(), m_TmpBuffer.Size()); result = m_Parser.Parse(FB.RoData(), m_TmpBuffer.Size()); write_offset = m_TmpBuffer.Size(); m_TmpBuffer.Size(0); } while ( ! m_ParserDelegate.m_CompletePicture && result == RESULT_OK ) { if ( FB.Capacity() < ( write_offset + VESReadSize ) ) { DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %u\n", FB.Capacity(), ( write_offset + VESReadSize )); return RESULT_SMALLBUF; } result = m_FileReader.Read(FB.Data() + write_offset, VESReadSize, &read_count); if ( result == RESULT_ENDOFFILE || read_count == 0 ) { m_EOF = true; if ( write_offset > 0 ) result = RESULT_OK; } if ( ASDCP_SUCCESS(result) ) { result = m_Parser.Parse(FB.RoData() + write_offset, read_count); write_offset += read_count; } if ( m_EOF ) break; } assert(m_ParserDelegate.m_FrameSize <= write_offset); if ( ASDCP_SUCCESS(result) && m_ParserDelegate.m_FrameSize < write_offset ) { assert(m_TmpBuffer.Size() == 0); ui32_t diff = write_offset - m_ParserDelegate.m_FrameSize; assert(diff <= m_TmpBuffer.Capacity()); memcpy(m_TmpBuffer.Data(), FB.RoData() + m_ParserDelegate.m_FrameSize, diff); m_TmpBuffer.Size(diff); } if ( ASDCP_SUCCESS(result) ) { const byte_t* p = FB.RoData(); if ( p[0] != 0 || p[1] != 0 || p[2] != 1 || ! ( p[3] == SEQ_START || p[3] == PIC_START ) ) { DefaultLogSink().Error("Frame buffer does not begin with a PIC or SEQ start code.\n"); return RESULT_RAW_FORMAT; } } if ( ASDCP_SUCCESS(result) ) { FB.Size(m_ParserDelegate.m_FrameSize); FB.TemporalOffset(m_ParserDelegate.m_TemporalRef); FB.FrameType(m_ParserDelegate.m_FrameType); FB.PlaintextOffset(m_ParserDelegate.m_PlaintextOffset); FB.FrameNumber(m_FrameNumber++); FB.GOPStart(m_ParserDelegate.m_HasGOP); FB.ClosedGOP(m_ParserDelegate.m_ClosedGOP); } return result; }