Skip to content
Snippets Groups Projects
Commit 7905bd55 authored by Carl Eugen Hoyos's avatar Carl Eugen Hoyos
Browse files

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
parent 256df8a2
No related branches found
No related tags found
No related merge requests found
...@@ -27,7 +27,11 @@ ...@@ -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, ...@@ -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, ...@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment