36 #define DEFAULT_SLICE_MB_WIDTH 8 38 #define FF_PROFILE_PRORES_PROXY 0 39 #define FF_PROFILE_PRORES_LT 1 40 #define FF_PROFILE_PRORES_STANDARD 2 41 #define FF_PROFILE_PRORES_HQ 3 56 0, 1, 8, 9, 2, 3, 10, 11,
57 16, 17, 24, 25, 18, 19, 26, 27,
58 4, 5, 12, 20, 13, 6, 7, 14,
59 21, 28, 29, 22, 15, 23, 30, 31,
60 32, 33, 40, 48, 41, 34, 35, 42,
61 49, 56, 57, 50, 43, 36, 37, 44,
62 51, 58, 59, 52, 45, 38, 39, 46,
63 53, 60, 61, 54, 47, 55, 62, 63
68 4, 7, 9, 11, 13, 14, 15, 63,
69 7, 7, 11, 12, 14, 15, 63, 63,
70 9, 11, 13, 14, 15, 63, 63, 63,
71 11, 11, 13, 14, 63, 63, 63, 63,
72 11, 13, 14, 63, 63, 63, 63, 63,
73 13, 14, 63, 63, 63, 63, 63, 63,
74 13, 63, 63, 63, 63, 63, 63, 63,
75 63, 63, 63, 63, 63, 63, 63, 63
77 4, 5, 6, 7, 9, 11, 13, 15,
78 5, 5, 7, 8, 11, 13, 15, 17,
79 6, 7, 9, 11, 13, 15, 15, 17,
80 7, 7, 9, 11, 13, 15, 17, 19,
81 7, 9, 11, 13, 14, 16, 19, 23,
82 9, 11, 13, 14, 16, 19, 23, 29,
83 9, 11, 13, 15, 17, 21, 28, 35,
84 11, 13, 16, 17, 21, 28, 35, 41
86 4, 4, 5, 5, 6, 7, 7, 9,
87 4, 4, 5, 6, 7, 7, 9, 9,
88 5, 5, 6, 7, 7, 9, 9, 10,
89 5, 5, 6, 7, 7, 9, 9, 10,
90 5, 6, 7, 7, 8, 9, 10, 12,
91 6, 7, 7, 8, 9, 10, 12, 15,
92 6, 7, 7, 9, 10, 11, 14, 17,
93 7, 7, 9, 10, 11, 14, 17, 21
95 4, 4, 4, 4, 4, 4, 4, 4,
96 4, 4, 4, 4, 4, 4, 4, 4,
97 4, 4, 4, 4, 4, 4, 4, 4,
98 4, 4, 4, 4, 4, 4, 4, 5,
99 4, 4, 4, 4, 4, 4, 5, 5,
100 4, 4, 4, 4, 4, 5, 5, 6,
101 4, 4, 4, 4, 5, 5, 6, 7,
102 4, 4, 4, 4, 5, 6, 7, 7
108 4, 7, 9, 11, 13, 14, 63, 63,
109 7, 7, 11, 12, 14, 63, 63, 63,
110 9, 11, 13, 14, 63, 63, 63, 63,
111 11, 11, 13, 14, 63, 63, 63, 63,
112 11, 13, 14, 63, 63, 63, 63, 63,
113 13, 14, 63, 63, 63, 63, 63, 63,
114 13, 63, 63, 63, 63, 63, 63, 63,
115 63, 63, 63, 63, 63, 63, 63, 63
117 4, 5, 6, 7, 9, 11, 13, 15,
118 5, 5, 7, 8, 11, 13, 15, 17,
119 6, 7, 9, 11, 13, 15, 15, 17,
120 7, 7, 9, 11, 13, 15, 17, 19,
121 7, 9, 11, 13, 14, 16, 19, 23,
122 9, 11, 13, 14, 16, 19, 23, 29,
123 9, 11, 13, 15, 17, 21, 28, 35,
124 11, 13, 16, 17, 21, 28, 35, 41
126 4, 4, 5, 5, 6, 7, 7, 9,
127 4, 4, 5, 6, 7, 7, 9, 9,
128 5, 5, 6, 7, 7, 9, 9, 10,
129 5, 5, 6, 7, 7, 9, 9, 10,
130 5, 6, 7, 7, 8, 9, 10, 12,
131 6, 7, 7, 8, 9, 10, 12, 15,
132 6, 7, 7, 9, 10, 11, 14, 17,
133 7, 7, 9, 10, 11, 14, 17, 21
135 4, 4, 4, 4, 4, 4, 4, 4,
136 4, 4, 4, 4, 4, 4, 4, 4,
137 4, 4, 4, 4, 4, 4, 4, 4,
138 4, 4, 4, 4, 4, 4, 4, 5,
139 4, 4, 4, 4, 4, 4, 5, 5,
140 4, 4, 4, 4, 4, 5, 5, 6,
141 4, 4, 4, 4, 5, 5, 6, 7,
142 4, 4, 4, 4, 5, 6, 7, 7
153 int qmat_luma[16][64];
154 int qmat_chroma[16][64];
159 unsigned int rice_order, exp_order, switch_bits, first_exp,
exp, zeros;
162 switch_bits = codebook & 3;
163 rice_order = codebook >> 5;
164 exp_order = (codebook >> 2) & 7;
166 first_exp = ((switch_bits + 1) << rice_order);
168 if (val >= first_exp) {
170 val += (1 << exp_order);
172 zeros = exp - exp_order + switch_bits + 1;
175 }
else if (rice_order) {
176 put_bits(pb, (val >> rice_order), 0);
185 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind])) 186 #define TO_GOLOMB(val) (((val) << 1) ^ ((val) >> 31)) 187 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign)) 188 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1) 189 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign)) 193 int sign = (val >> 31);
194 return (val ^ sign) - sign;
197 #define FIRST_DC_CB 0xB8 202 int blocks_per_slice,
int *qmat)
206 int new_dc,
delta, diff_sign, new_code;
208 prev_dc =
QSCALE(qmat, 0, in[0] - 16384);
212 code = 5; sign = 0; idx = 64;
213 for (i = 1; i < blocks_per_slice; i++, idx += 64) {
214 new_dc =
QSCALE(qmat, 0, in[idx] - 16384);
215 delta = new_dc - prev_dc;
228 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
230 0x28, 0x28, 0x28, 0x4C };
233 int16_t *
in,
int blocks_per_slice,
int *qmat)
239 for (i = 1; i < 64; i++) {
241 for (j = 0; j < blocks_per_slice; j++) {
242 int val =
QSCALE(qmat, indp, in[(j << 6) + indp]);
267 for (i = 0; i < 8; i++) {
289 int i, blocks_per_slice;
293 for (i = 0; i < mb_count; i++) {
294 fdct_get(fdsp, src, src_stride, block + (0 << 6));
295 fdct_get(fdsp, src + 8 * src_stride, src_stride, block + ((2 - chroma) << 6));
297 fdct_get(fdsp, src + 16, src_stride, block + (1 << 6));
298 fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, block + (3 << 6));
305 blocks_per_slice = mb_count << (2 -
chroma);
317 int chroma_stride,
unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
318 unsigned* y_data_size,
unsigned* u_data_size,
unsigned* v_data_size,
324 buf, data_size, ctx->
qmat_luma[qp - 1], 0);
328 chroma_stride, buf + *y_data_size, data_size - *y_data_size,
332 chroma_stride, buf + *y_data_size + *u_data_size,
333 data_size - *y_data_size - *u_data_size,
337 return *y_data_size + *u_data_size + *v_data_size;
342 unsigned dst_width,
unsigned dst_height)
345 int box_width =
FFMIN(width - x, dst_width);
346 int box_height =
FFMIN(height - y, dst_height);
347 int i, j, src_stride = stride >> 1;
348 uint16_t last_pix, *last_line;
350 src += y * src_stride + x;
351 for (i = 0; i < box_height; ++i) {
352 for (j = 0; j < box_width; ++j) {
355 last_pix = dst[j - 1];
356 for (; j < dst_width; j++)
361 last_line = dst - dst_width;
362 for (; i < dst_height; i++) {
363 for (j = 0; j < dst_width; ++j) {
364 dst[j] = last_line[j];
371 int mb_y,
unsigned mb_count,
uint8_t *
buf,
unsigned data_size,
374 int luma_stride, chroma_stride;
375 int hdr_size = 6, slice_size;
376 uint8_t *dest_y, *dest_u, *dest_v;
377 unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0;
380 int low_bytes = (tgt_bits - (tgt_bits >> 3)) >> 3;
381 int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
386 dest_y = pic->
data[0] + (mb_y << 4) * luma_stride + (mb_x << 5);
387 dest_u = pic->
data[1] + (mb_y << 4) * chroma_stride + (mb_x << 4);
388 dest_v = pic->
data[2] + (mb_y << 4) * chroma_stride + (mb_x << 4);
394 (uint16_t *) ctx->
fill_y, mb_count << 4, 16);
397 (uint16_t *) ctx->
fill_u, mb_count << 3, 16);
400 (uint16_t *) ctx->
fill_v, mb_count << 3, 16);
403 mb_count << 5, mb_count << 4, mb_count, buf + hdr_size,
404 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
408 luma_stride, chroma_stride, mb_count, buf + hdr_size,
409 data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
416 luma_stride, chroma_stride, mb_count, buf + hdr_size,
417 data_size - hdr_size, &y_data_size, &u_data_size,
420 }
else if (slice_size < low_bytes && *qp
425 luma_stride, chroma_stride, mb_count, buf + hdr_size,
426 data_size - hdr_size, &y_data_size, &u_data_size,
432 buf[0] = hdr_size << 3;
437 return hdr_size + y_data_size + u_data_size + v_data_size;
443 int mb_width = (avctx->
width + 15) >> 4;
444 int mb_height = (avctx->
height + 15) >> 4;
445 int hdr_size, sl_size, i;
446 int mb_y, sl_data_size, qp;
447 int unsafe_bot, unsafe_right;
448 uint8_t *sl_data, *sl_data_sizes;
449 int slice_per_line = 0, rem = mb_width;
452 slice_per_line += rem >> i;
457 hdr_size = 8; sl_data_size = buf_size - hdr_size;
458 sl_data_sizes = buf + hdr_size;
459 sl_data = sl_data_sizes + (slice_per_line * mb_height * 2);
460 for (mb_y = 0; mb_y < mb_height; mb_y++) {
463 while (mb_x < mb_width) {
464 while (mb_width - mb_x < slice_mb_count)
465 slice_mb_count >>= 1;
467 unsafe_bot = (avctx->
height & 0xf) && (mb_y == mb_height - 1);
468 unsafe_right = (avctx->
width & 0xf) && (mb_x + slice_mb_count == mb_width);
470 sl_size =
encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
471 sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp);
473 bytestream_put_be16(&sl_data_sizes, sl_size);
475 sl_data_size -= sl_size;
476 mb_x += slice_mb_count;
480 buf[0] = hdr_size << 3;
481 AV_WB32(buf + 1, sl_data - buf);
482 AV_WB16(buf + 5, slice_per_line * mb_height);
485 return sl_data -
buf;
489 const AVFrame *pict,
int *got_packet)
491 int header_size = 148;
502 pkt->
size - header_size - 8);
504 bytestream_put_be32(&buf, pic_size + 8 + header_size);
507 bytestream_put_be16(&buf, header_size);
508 bytestream_put_be16(&buf, 0);
510 bytestream_put_be16(&buf, avctx->
width);
511 bytestream_put_be16(&buf, avctx->
height);
525 pkt->
size = pic_size + 8 + header_size;
534 for (i = 0; i < 64; i++)
535 dst[i] = src[i] * scale;
549 if (avctx->
width & 0x1) {
551 "frame width needs to be multiple of 2\n");
555 if (avctx->
width > 65534 || avctx->
height > 65535) {
557 "The maximum dimensions are 65534x65535\n");
561 if ((avctx->
height & 0xf) || (avctx->
width & 0xf)) {
572 "encoding with ProRes standard (apcn) profile\n");
579 "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch]\n",
588 for (i = 1; i <= 16; i++) {
const char const char void * val
This structure describes decoded (raw) audio or video data.
static const uint8_t QMAT_LUMA[4][64]
static void put_sbits(PutBitContext *pb, int n, int32_t value)
static const int bitrate_table[5]
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
#define TO_GOLOMB2(val, sign)
static av_cold int init(AVCodecContext *avctx)
static av_always_inline unsigned encode_slice_data(AVCodecContext *avctx, uint8_t *dest_y, uint8_t *dest_u, uint8_t *dest_v, int luma_stride, int chroma_stride, unsigned mb_count, uint8_t *buf, unsigned data_size, unsigned *y_data_size, unsigned *u_data_size, unsigned *v_data_size, int qp)
uint8_t qmat_chroma[64]
dequantization matrix for chroma
static av_cold int prores_encode_init(AVCodecContext *avctx)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x, int mb_y, unsigned mb_count, uint8_t *buf, unsigned data_size, int unsafe, int *qp)
#define FF_PROFILE_PRORES_PROXY
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
static int encode_slice_plane(AVCodecContext *avctx, int mb_count, uint8_t *src, int src_stride, uint8_t *buf, unsigned buf_size, int *qmat, int chroma)
#define AV_CODEC_CAP_INTRA_ONLY
Codec is intra only.
static int prores_encode_picture(AVCodecContext *avctx, const AVFrame *pic, uint8_t *buf, const int buf_size)
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
static void encode_dc_coeffs(PutBitContext *pb, int16_t *in, int blocks_per_slice, int *qmat)
static const uint8_t QMAT_CHROMA[4][64]
static const uint8_t progressive_scan[64]
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_INPUT_BUFFER_MIN_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static const uint8_t lev_to_cb[10]
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_cold int prores_encode_close(AVCodecContext *avctx)
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
int flags
A combination of AV_PKT_FLAG values.
static av_always_inline int get_level(int val)
static void scale_mat(const uint8_t *src, int *dst, int scale)
static const AVProfile profiles[]
int width
picture width / height.
#define FF_PROFILE_UNKNOWN
#define FF_PROFILE_PRORES_STANDARD
#define DEFAULT_SLICE_MB_WIDTH
void(* fdct)(int16_t *block)
AVCodec ff_prores_encoder
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AV_LOG_INFO
Standard information.
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
static const uint8_t dc_codebook[7]
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
const char * name
short name for the profile
#define QSCALE(qmat, ind, val)
static void encode_codeword(PutBitContext *pb, int val, int codebook)
static enum AVPixelFormat pix_fmts[]
#define AV_PIX_FMT_YUV422P10
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static void fdct_get(FDCTDSPContext *fdsp, uint8_t *pixels, int stride, int16_t *block)
static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y, unsigned stride, unsigned width, unsigned height, uint16_t *dst, unsigned dst_width, unsigned dst_height)
AVCodec ff_prores_aw_encoder
static const int qp_start_table[4]
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
#define LOCAL_ALIGNED(a, t, v,...)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
uint8_t qmat_luma[64]
dequantization matrix for luma
#define FF_PROFILE_PRORES_HQ
#define DIFF_SIGN(val, sign)
static const uint8_t run_to_cb[16]
AVPixelFormat
Pixel format.
#define FF_PROFILE_PRORES_LT
This structure stores compressed data.
static void encode_ac_coeffs(AVCodecContext *avctx, PutBitContext *pb, int16_t *in, int blocks_per_slice, int *qmat)
static const int qp_end_table[4]