1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2026-06-19 19:03:00 +02:00

prores_raw: export raw camera color data values

This commit is contained in:
Lynne
2026-05-16 17:40:35 +09:00
parent 12dc67b6fe
commit 0def4ceb18
+35 -6
View File
@@ -21,9 +21,12 @@
*/
#include "libavutil/avassert.h"
#include "libavutil/intfloat.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mem_internal.h"
#include "libavutil/mem.h"
#include "libavutil/raw_color_params.h"
#include "libavutil/rational.h"
#define CACHED_BITSTREAM_READER !ARCH_X86_32
@@ -417,12 +420,22 @@ static int decode_frame(AVCodecContext *avctx,
return AVERROR_PATCHWELCOME;
}
bytestream2_skip(&gb_hdr, 2); /* senselValueRange (white_level = value + 0x100, black_level = 0x100) */
bytestream2_skip(&gb_hdr, 4); /* WhiteBalanceRedFactor (float, pre-debayer R gain) */
bytestream2_skip(&gb_hdr, 4); /* WhiteBalanceBlueFactor (float, pre-debayer B gain) */
bytestream2_skip(&gb_hdr, 4 * 3 * 3); /* ColorMatrix (3x3 float, camera RGB -> Rec.2020 linear, row-major) */
bytestream2_skip(&gb_hdr, 4); /* GainFactor (float, post-matrix scene-linear scale) */
bytestream2_skip(&gb_hdr, 2); /* WhiteBalanceCCT (Kelvin, informational) */
/* senselValueRange: black_level is hardcoded to 0x100,
* white_level = senselValueRange + 0x100 */
uint16_t black_level = 0x100;
uint16_t white_level = bytestream2_get_be16(&gb_hdr) + 0x100;
float wb_red = av_int2float(bytestream2_get_be32(&gb_hdr)); /* WhiteBalanceRedFactor */
float wb_blue = av_int2float(bytestream2_get_be32(&gb_hdr)); /* WhiteBalanceBlueFactor */
/* ColorMatrix (3x3 float, camera RGB -> CIE 1931 XYZ D65, row-major) */
float color_matrix[3][3];
for (int r = 0; r < 3; r++)
for (int c = 0; c < 3; c++)
color_matrix[r][c] = av_int2float(bytestream2_get_be32(&gb_hdr));
float gain = av_int2float(bytestream2_get_be32(&gb_hdr)); /* GainFactor (post-matrix mult) */
uint16_t wb_cct = bytestream2_get_be16(&gb_hdr); /* WhiteBalanceCCT (Kelvin, informational) */
/* Flags */
int flags = bytestream2_get_be16(&gb_hdr);
@@ -537,6 +550,22 @@ static int decode_frame(AVCodecContext *avctx,
frame->pict_type = AV_PICTURE_TYPE_I;
frame->flags |= AV_FRAME_FLAG_KEY;
AVRawColorParams *rcp = av_raw_color_params_create_side_data(frame);
if (!rcp)
return AVERROR(ENOMEM);
rcp->type = AV_RAW_COLOR_PARAMS_PRORES_RAW;
rcp->black_level = av_make_q(black_level, 65535);
rcp->white_level = av_make_q(white_level, 65535);
rcp->wb_cct = wb_cct;
AVProResRawColorParams *pr = &rcp->codec.prores_raw;
pr->wb_red = av_d2q(wb_red, INT_MAX);
pr->wb_blue = av_d2q(wb_blue, INT_MAX);
pr->gain = av_d2q(gain, INT_MAX);
for (int r = 0; r < 3; r++)
for (int c = 0; c < 3; c++)
pr->color_matrix[r][c] = av_d2q(color_matrix[r][c], INT_MAX);
*got_frame_ptr = 1;
return avpkt->size;