FFMPEG Plugin: Implement and use calculation of bytes per row.
This commit is contained in:
@@ -908,7 +908,9 @@ AVCodecDecoder::_UpdateMediaHeaderForVideoFrame()
|
|||||||
fHeader.start_time = fRawDecodedPicture->reordered_opaque;
|
fHeader.start_time = fRawDecodedPicture->reordered_opaque;
|
||||||
fHeader.u.raw_video.display_line_width = fRawDecodedPicture->width;
|
fHeader.u.raw_video.display_line_width = fRawDecodedPicture->width;
|
||||||
fHeader.u.raw_video.display_line_count = fRawDecodedPicture->height;
|
fHeader.u.raw_video.display_line_count = fRawDecodedPicture->height;
|
||||||
fHeader.u.raw_video.bytes_per_row = 0; // TODO: Implement calculation
|
fHeader.u.raw_video.bytes_per_row
|
||||||
|
= CalculateBytesPerRowWithColorSpaceAndVideoWidth(
|
||||||
|
fOutputVideoFormat.display.format, fRawDecodedPicture->width);
|
||||||
fHeader.u.raw_video.field_gamma = 1.0;
|
fHeader.u.raw_video.field_gamma = 1.0;
|
||||||
fHeader.u.raw_video.field_sequence = fFrame;
|
fHeader.u.raw_video.field_sequence = fFrame;
|
||||||
fHeader.u.raw_video.field_number = 0;
|
fHeader.u.raw_video.field_number = 0;
|
||||||
|
|||||||
@@ -7,13 +7,15 @@
|
|||||||
#define UTILITIES_H
|
#define UTILITIES_H
|
||||||
|
|
||||||
|
|
||||||
/*! \brief This file contains functions to convert values from FFmpeg to Media
|
/*! \brief This file contains functions to convert and calculate values from
|
||||||
Kit and vice versa.
|
FFmpeg to Media Kit and vice versa.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <GraphicsDefs.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
}
|
}
|
||||||
@@ -70,5 +72,37 @@ ConvertAVCodecContextToVideoAspectWidthAndHeight(AVCodecContext& contextIn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Calculates bytes per row for a video frame.
|
||||||
|
|
||||||
|
\param colorSpace The Media Kit color space the video frame uses.
|
||||||
|
\param videoWidth The width of the video frame.
|
||||||
|
|
||||||
|
\returns bytes per video frame row
|
||||||
|
\returns Zero, when bytes per video frame cannot be calculated.
|
||||||
|
*/
|
||||||
|
inline uint32
|
||||||
|
CalculateBytesPerRowWithColorSpaceAndVideoWidth(color_space colorSpace, int videoWidth)
|
||||||
|
{
|
||||||
|
assert(videoWidth >= 0);
|
||||||
|
|
||||||
|
const uint32 kBytesPerRowUnknown = 0;
|
||||||
|
size_t bytesPerPixel;
|
||||||
|
size_t rowAlignment;
|
||||||
|
|
||||||
|
if (get_pixel_size_for(colorSpace, &bytesPerPixel, &rowAlignment, NULL) != B_OK)
|
||||||
|
return kBytesPerRowUnknown;
|
||||||
|
|
||||||
|
uint32 bytesPerRow = bytesPerPixel * videoWidth;
|
||||||
|
uint32 numberOfUnalignedBytes = bytesPerRow % rowAlignment;
|
||||||
|
|
||||||
|
if (numberOfUnalignedBytes == 0)
|
||||||
|
return bytesPerRow;
|
||||||
|
|
||||||
|
uint32 numberOfBytesNeededForAlignment = rowAlignment - numberOfUnalignedBytes;
|
||||||
|
bytesPerRow += numberOfBytesNeededForAlignment;
|
||||||
|
|
||||||
|
return bytesPerRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // UTILITIES_H
|
#endif // UTILITIES_H
|
||||||
|
|||||||
Reference in New Issue
Block a user