|
|
|
@ -32,7 +32,6 @@ |
|
|
|
|
#include "avcodec.h" |
|
|
|
|
#include "codec_internal.h" |
|
|
|
|
#include "encode.h" |
|
|
|
|
#include "internal.h" |
|
|
|
|
#include "profiles.h" |
|
|
|
|
#include "proresdata.h" |
|
|
|
|
#include "put_bits.h" |
|
|
|
@ -198,6 +197,35 @@ typedef struct { |
|
|
|
|
char *vendor; |
|
|
|
|
} ProresContext; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if a value is in the list. If not, return the default value |
|
|
|
|
* |
|
|
|
|
* @param ctx Context for the log msg |
|
|
|
|
* @param val_name Name of the checked value, for log msg |
|
|
|
|
* @param array_valid_values Array of valid int, ended with INT_MAX |
|
|
|
|
* @param default_value Value return if checked value is not in the array |
|
|
|
|
* @return Value or default_value. |
|
|
|
|
*/ |
|
|
|
|
static int int_from_list_or_default(void *ctx, const char *val_name, int val, |
|
|
|
|
const int *array_valid_values, int default_value) |
|
|
|
|
{ |
|
|
|
|
int i = 0; |
|
|
|
|
|
|
|
|
|
while (1) { |
|
|
|
|
int ref_val = array_valid_values[i]; |
|
|
|
|
if (ref_val == INT_MAX) |
|
|
|
|
break; |
|
|
|
|
if (val == ref_val) |
|
|
|
|
return val; |
|
|
|
|
i++; |
|
|
|
|
} |
|
|
|
|
/* val is not a valid value */ |
|
|
|
|
av_log(ctx, AV_LOG_DEBUG, |
|
|
|
|
"%s %d are not supported. Set to default value : %d\n", |
|
|
|
|
val_name, val, default_value); |
|
|
|
|
return default_value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void encode_codeword(PutBitContext *pb, int val, int codebook) |
|
|
|
|
{ |
|
|
|
|
unsigned int rice_order, exp_order, switch_bits, first_exp, exp, zeros; |
|
|
|
@ -761,9 +789,12 @@ static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
|
*buf++ = frame_flags; |
|
|
|
|
*buf++ = 0; /* reserved */ |
|
|
|
|
/* only write color properties, if valid value. set to unspecified otherwise */ |
|
|
|
|
*buf++ = ff_int_from_list_or_default(avctx, "frame color primaries", pict->color_primaries, valid_primaries, 0); |
|
|
|
|
*buf++ = ff_int_from_list_or_default(avctx, "frame color trc", pict->color_trc, valid_trc, 0); |
|
|
|
|
*buf++ = ff_int_from_list_or_default(avctx, "frame colorspace", pict->colorspace, valid_colorspace, 0); |
|
|
|
|
*buf++ = int_from_list_or_default(avctx, "frame color primaries", |
|
|
|
|
pict->color_primaries, valid_primaries, 0); |
|
|
|
|
*buf++ = int_from_list_or_default(avctx, "frame color trc", |
|
|
|
|
pict->color_trc, valid_trc, 0); |
|
|
|
|
*buf++ = int_from_list_or_default(avctx, "frame colorspace", |
|
|
|
|
pict->colorspace, valid_colorspace, 0); |
|
|
|
|
if (avctx->profile >= FF_PROFILE_PRORES_4444) { |
|
|
|
|
if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10) { |
|
|
|
|
*buf++ = 0xA0;/* src b64a and no alpha */ |
|
|
|
|