Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
131 lines (115 sloc) 4.49 KB
/*
* FrameBuffer.h
* Created by Graham Booker on 1/30/07.
*
* This file is part of Perian.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* This file implements a mechanisms for tracking frame data and dependencies
* as well as yet to be parsed data. It is intented to minimize memcpys
*/
typedef struct FrameData_s FrameData;
typedef struct FFusionData_s FFusionData;
struct FrameData_s
{
uint8_t *buffer; /*!< @brief Compressed frame data*/
unsigned int dataSize; /*!< @brief Size of buffer*/
long frameNumber; /*!< @brief Frame number as counted by QT*/
short type; /*!< @brief FFmpeg frame type*/
short skippabble; /*!< @brief True if this frame is not a reference for any other frames (B Frame)*/
short decoded; /*!< @brief True if this frame is already decoded*/
FrameData *prereqFrame; /*!< @brief The frame's data which must be decoded to fully display this frame */
FrameData *nextFrame; /*!< @brief The next frame to decode if this one is already decoded. This is for predictive decoding */
FFusionData *data; /*!< @brief Pointer to the data set*/
};
typedef struct DataRingBuffer_s {
} DataRingBuffer;
struct FFusionData_s
{
FrameData unparsedFrames; /*!< @brief buffer storage for data that's not yet parsed (packed data for subsequent frames)*/
/* private */
unsigned int frameSize; /*!< @brief Size of frames array in elements*/
unsigned int frameRead; /*!< @brief Current frame read index*/
unsigned int frameWrite; /*!< @brief Current frame write index*/
FrameData *frames; /*!< @brief array of frames*/
unsigned int ringSize; /*!< @brief Size of ring buffer in bytes*/
unsigned int ringRead; /*!< @brief Current read byte index*/
unsigned int ringWrite; /*!< @brief Current write byte index*/
uint8_t *ringBuffer; /*!< @brief Ring buffer for all data*/
FFusionData *previousData; /*!< @brief Pointer to previous FFusionData struct that's kept during expansion and freed when it's data isn't used anymore*/
};
/*!
* @brief Initialize a FFusionData structure
*
* @param data The data to initialize
* @param dataSize The frame count to start with
* @param bufferSize The ring buffer size to start with
*/
void FFusionDataSetup(FFusionData *data, int dataSize, int bufferSize);
/*!
* @brief Deinitialize a FFusionData structure
*
* @param data The data to deinitialize (data is not freed)
*/
void FFusionDataFree(FFusionData *data);
/*!
* @brief Sets the ring buffer pointer to the given buffer (no parsing used)
*
* @param data The FFusionData
* @param buffer The buffer to place in data
* @param bufferSize The size of the buffer
*/
uint8_t *FFusionCreateEntireDataBuffer(FFusionData *data, uint8_t *buffer, int bufferSize);
/*!
* @brief Append a parsed frame's data
*
* @param data The FFusionData
* @param buffer The frame's data
* @param bufferSize The size of the buffer
* @param type The FFmpeg type for this frame
*/
FrameData *FFusionDataAppend(FFusionData *data, uint8_t *buffer, int dataSize, int type);
/*!
* @brief Sets the unparsed data buffer
*
* @param data The FFusionData
* @param buffer The unparsed data
* @param bufferSize The size of the buffer
*/
void FFusionDataSetUnparsed(FFusionData *data, uint8_t *buffer, int bufferSize);
void FFusionDataReadUnparsed(FFusionData *data);
/*!
* @brief Mark a frame as no longer needed
*
* @param toData the completed Frame
*/
void FFusionDataMarkRead(FrameData *toData);
/*!
* @brief Find a frame's data
*
* @param data The FFusionData
* @param frameNumber The frame number as assigned by QT
* @return The frame data if found, NULL otherwise
*/
FrameData *FFusionDataFind(FFusionData *data, int frameNumber);
/*!
* @brief Get a frame's prerequisite for decode
*
* @param toData the frame to check
* @return The frame's prereq if exists, NULL otherwise
*/
FrameData *FrameDataCheckPrereq(FrameData *toData);