mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 01:02:33 +00:00
Fix decoding for little endian Aja Kona 10-bit RGB.
The little endian fourcc is r10k, big endian uses R10k. Reported and analyzed by Jason Freets, jasonslife hotmail
This commit is contained in:
parent
256df8a2fa
commit
7905bd5555
@ -27,7 +27,11 @@
|
|||||||
|
|
||||||
static av_cold int decode_init(AVCodecContext *avctx)
|
static av_cold int decode_init(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
avctx->pix_fmt = AV_PIX_FMT_RGB48;
|
if ((avctx->codec_tag & 0xFFFFFF) == MKTAG('r', '1', '0', 0)) {
|
||||||
|
avctx->pix_fmt = AV_PIX_FMT_BGR48;
|
||||||
|
} else {
|
||||||
|
avctx->pix_fmt = AV_PIX_FMT_RGB48;
|
||||||
|
}
|
||||||
avctx->bits_per_raw_sample = 10;
|
avctx->bits_per_raw_sample = 10;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -42,6 +46,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
int aligned_width = FFALIGN(avctx->width,
|
int aligned_width = FFALIGN(avctx->width,
|
||||||
avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64);
|
avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64);
|
||||||
uint8_t *dst_line;
|
uint8_t *dst_line;
|
||||||
|
int r10 = (avctx->codec_tag & 0xFFFFFF) == MKTAG('r', '1', '0', 0);
|
||||||
|
|
||||||
if (avpkt->size < 4 * aligned_width * avctx->height) {
|
if (avpkt->size < 4 * aligned_width * avctx->height) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "packet too small\n");
|
av_log(avctx, AV_LOG_ERROR, "packet too small\n");
|
||||||
@ -60,12 +65,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
for (w = 0; w < avctx->width; w++) {
|
for (w = 0; w < avctx->width; w++) {
|
||||||
uint32_t pixel;
|
uint32_t pixel;
|
||||||
uint16_t r, g, b;
|
uint16_t r, g, b;
|
||||||
if (avctx->codec_id==AV_CODEC_ID_AVRP) {
|
if (avctx->codec_id == AV_CODEC_ID_AVRP || r10) {
|
||||||
pixel = av_le2ne32(*src++);
|
pixel = av_le2ne32(*src++);
|
||||||
} else {
|
} else {
|
||||||
pixel = av_be2ne32(*src++);
|
pixel = av_be2ne32(*src++);
|
||||||
}
|
}
|
||||||
if (avctx->codec_id==AV_CODEC_ID_R210) {
|
if (avctx->codec_id == AV_CODEC_ID_R210 || r10) {
|
||||||
b = pixel << 6;
|
b = pixel << 6;
|
||||||
g = (pixel >> 4) & 0xffc0;
|
g = (pixel >> 4) & 0xffc0;
|
||||||
r = (pixel >> 14) & 0xffc0;
|
r = (pixel >> 14) & 0xffc0;
|
||||||
|
Loading…
Reference in New Issue
Block a user