79 #define CVID_HEADER_SIZE 10
80 #define STRIP_HEADER_SIZE 12
81 #define CHUNK_HEADER_SIZE 4
83 #define MB_SIZE 4 //4x4 MBs
84 #define MB_AREA (MB_SIZE*MB_SIZE)
86 #define VECTOR_MAX 6 //six or four entries per vector depending on format
87 #define CODEBOOK_MAX 256 //size of a codebook
89 #define MAX_STRIPS 32 //Note: having fewer choices regarding the number of strips speeds up encoding (obviously)
90 #define MIN_STRIPS 1 //Note: having more strips speeds up encoding the frame (this is less obvious)
152 #ifdef CINEPAKENC_DEBUG
154 int num_v1_mode, num_v4_mode, num_mc_mode;
155 int num_v1_encs, num_v4_encs, num_skips;
165 #define OFFSET(x) offsetof(CinepakEncContext, x)
166 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
168 {
"max_extra_cb_iterations",
"Max extra codebook recalculation passes, more is better and slower",
OFFSET(max_extra_cb_iterations),
AV_OPT_TYPE_INT, { .i64 = 2 }, 0, INT_MAX,
VE },
169 {
"skip_empty_cb",
"Avoid wasting bytes, ignore vintage MacOS decoder",
OFFSET(skip_empty_cb),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
170 {
"max_strips",
"Limit strips/frame, vintage compatible is 1..3, otherwise the more the better",
OFFSET(max_max_strips),
AV_OPT_TYPE_INT, { .i64 = 3 },
MIN_STRIPS,
MAX_STRIPS,
VE },
171 {
"min_strips",
"Enforce min strips/frame, more is worse and faster, must be <= max_strips",
OFFSET(min_min_strips),
AV_OPT_TYPE_INT, { .i64 =
MIN_STRIPS },
MIN_STRIPS,
MAX_STRIPS,
VE },
172 {
"strip_number_adaptivity",
"How fast the strip number adapts, more is slightly better, much slower",
OFFSET(strip_number_delta_range),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0,
MAX_STRIPS-
MIN_STRIPS,
VE },
186 int x, mb_count, strip_buf_size, frame_buf_size;
189 av_log(avctx,
AV_LOG_ERROR,
"width and height must be multiples of four (got %ix%i)\n",
195 av_log(avctx,
AV_LOG_ERROR,
"minimal number of strips can not exceed maximal (got %i and %i)\n",
239 #ifdef CINEPAKENC_DEBUG
284 #ifdef CINEPAKENC_DEBUG
285 s->num_v1_mode = s->num_v4_mode = s->num_mc_mode = s->num_v1_encs = s->num_v4_encs = s->num_skips = 0;
301 #ifdef CINEPAKENC_DEBUG
312 #ifdef CINEPAK_REPORT_SERR
322 int64_t score1, score2, score3;
329 #ifdef CINEPAK_REPORT_SERR
336 ret += s->
lambda * 8 * mb_count;
339 for(x = 0; x < mb_count; x++) {
342 #ifdef CINEPAK_REPORT_SERR
355 *training_set_v1_shrunk = *training_set_v4_shrunk = 0;
356 for(x = 0; x < mb_count; x++) {
364 #ifdef CINEPAK_REPORT_SERR
369 for(x = 0; x < mb_count; x++) {
374 if(score1 <= score2) {
376 #ifdef CINEPAK_REPORT_SERR
382 #ifdef CINEPAK_REPORT_SERR
394 int v1_shrunk = 0, v4_shrunk = 0;
395 for(x = 0; x < mb_count; x++) {
402 #ifdef CINEPAK_REPORT_SERR
410 #ifdef CINEPAK_REPORT_SERR
415 #ifdef CINEPAK_REPORT_SERR
424 #ifdef CINEPAK_REPORT_SERR
429 #ifdef CINEPAK_REPORT_SERR
435 *training_set_v1_shrunk = v1_shrunk;
436 *training_set_v4_shrunk = v4_shrunk;
438 for(x = 0; x < mb_count; x++) {
444 if(score1 <= score2 && score1 <= score3) {
446 #ifdef CINEPAK_REPORT_SERR
450 }
else if(score2 <= score3) {
452 #ifdef CINEPAK_REPORT_SERR
458 #ifdef CINEPAK_REPORT_SERR
482 int incremental_codebook_replacement_mode = 0;
487 chunk_type_yuv+(incremental_codebook_replacement_mode?1:0) :
488 chunk_type_gray+(incremental_codebook_replacement_mode?1:0),
490 + (incremental_codebook_replacement_mode?(size+31)/32*4:0) );
497 if(incremental_codebook_replacement_mode) {
500 for(x = 0; x <
size; x++) {
506 flags = ((flags>>1) | 0x80000000);
507 for(y = 0; y < entry_size; y++)
508 buf[ret++] = codebook[y + x*entry_size] ^ (y >= 4 ? 0x80 : 0);
509 if((flags&0xffffffff) == 0xffffffff) {
510 AV_WB32(&buf[flagsind], flags);
515 AV_WB32(&buf[flagsind], flags);
517 for(x = 0; x <
size; x++)
518 for(y = 0; y < entry_size; y++)
519 buf[ret++] = codebook[y + x*entry_size] ^ (y >= 4 ? 0x80 : 0);
526 uint8_t * in_data[4],
int in_linesize[4],
527 uint8_t *out_data[4],
int out_linesize[4])
529 out_data[0] = in_data[0] + x + y * in_linesize[0];
530 out_linesize[0] = in_linesize[0];
533 out_data[1] = in_data[1] + (x >> 1) + (y >> 1) * in_linesize[1];
534 out_linesize[1] = in_linesize[1];
536 out_data[2] = in_data[2] + (x >> 1) + (y >> 1) * in_linesize[2];
537 out_linesize[2] = in_linesize[2];
543 int linesize[4],
int v1_vector,
strip_info *info)
549 data[0][ linesize[0]] =
550 data[0][1+ linesize[0]] = info->
v1_codebook[v1_vector*entry_size];
554 data[0][2+ linesize[0]] =
555 data[0][3+ linesize[0]] = info->
v1_codebook[v1_vector*entry_size+1];
557 data[0][2*linesize[0]] =
558 data[0][1+2*linesize[0]] =
559 data[0][ 3*linesize[0]] =
560 data[0][1+3*linesize[0]] = info->
v1_codebook[v1_vector*entry_size+2];
562 data[0][2+2*linesize[0]] =
563 data[0][3+2*linesize[0]] =
564 data[0][2+3*linesize[0]] =
565 data[0][3+3*linesize[0]] = info->
v1_codebook[v1_vector*entry_size+3];
570 data[1][ linesize[1]] =
571 data[1][1+ linesize[1]] = info->
v1_codebook[v1_vector*entry_size+4];
575 data[2][ linesize[2]] =
576 data[2][1+ linesize[2]] = info->
v1_codebook[v1_vector*entry_size+5];
582 int linesize[4],
int *v4_vector,
strip_info *info)
586 for(i = y = 0; y < 4; y += 2) {
587 for(x = 0; x < 4; x += 2, i++) {
588 data[0][x + y*linesize[0]] = info->
v4_codebook[v4_vector[i]*entry_size];
589 data[0][x+1 + y*linesize[0]] = info->
v4_codebook[v4_vector[i]*entry_size+1];
590 data[0][x + (y+1)*linesize[0]] = info->
v4_codebook[v4_vector[i]*entry_size+2];
591 data[0][x+1 + (y+1)*linesize[0]] = info->
v4_codebook[v4_vector[i]*entry_size+3];
594 data[1][(x>>1) + (y>>1)*linesize[1]] = info->
v4_codebook[v4_vector[i]*entry_size+4];
595 data[2][(x>>1) + (y>>1)*linesize[2]] = info->
v4_codebook[v4_vector[i]*entry_size+5];
602 uint8_t *a_data[4],
int a_linesize[4],
603 uint8_t *b_data[4],
int b_linesize[4])
608 memcpy(a_data[0]+y*a_linesize[0], b_data[0]+y*b_linesize[0],
613 for(p = 1; p <= 2; p++) {
614 for(y = 0; y < MB_SIZE/2; y++) {
615 memcpy(a_data[p] + y*a_linesize[p],
616 b_data[p] + y*b_linesize[p],
624 uint8_t *scratch_data[4],
int scratch_linesize[4],
625 uint8_t *last_data[4],
int last_linesize[4],
628 int x, y, z,
flags,
bits, temp_size, header_ofs, ret = 0, mb_count = s->
w * h /
MB_AREA;
629 int needs_extra_bit, should_write_temp;
630 unsigned char temp[64];
632 uint8_t *sub_scratch_data[4] = {0}, *sub_last_data[4] = {0};
633 int sub_scratch_linesize[4] = {0}, sub_last_linesize[4] = {0};
646 for(z = y = 0; y <
h; y +=
MB_SIZE) {
647 for(x = 0; x < s->
w; x +=
MB_SIZE, z++) {
651 sub_scratch_data, sub_scratch_linesize);
655 last_data, last_linesize,
656 sub_last_data, sub_last_linesize);
657 copy_mb(s, sub_scratch_data, sub_scratch_linesize,
658 sub_last_data, sub_last_linesize);
673 for(x = 0; x < mb_count; x++)
682 for(x = 0; x < mb_count; x += 32) {
684 for(y = x; y <
FFMIN(x+32, mb_count); y++)
686 flags |= 1 << (31 - y + x);
691 for(y = x; y <
FFMIN(x+32, mb_count); y++) {
697 for(z = 0; z < 4; z++)
709 flags = bits = temp_size = 0;
711 for(x = 0; x < mb_count; x++) {
715 should_write_temp = 0;
730 memcpy(&buf[ret], temp, temp_size);
734 should_write_temp = 1;
737 if(needs_extra_bit) {
745 for(z = 0; z < 4; z++)
748 if(should_write_temp) {
749 memcpy(&buf[ret], temp, temp_size);
758 memcpy(&buf[ret], temp, temp_size);
772 uint8_t *a_data[4],
int a_linesize[4],
773 uint8_t *b_data[4],
int b_linesize[4])
775 int x, y, p, d, ret = 0;
779 d = a_data[0][x + y*a_linesize[0]] - b_data[0][x + y*b_linesize[0]];
785 for(p = 1; p <= 2; p++) {
786 for(y = 0; y < MB_SIZE/2; y++) {
787 for(x = 0; x < MB_SIZE/2; x++) {
788 d = a_data[p][x + y*a_linesize[p]] - b_data[p][x + y*b_linesize[p]];
799 #define CERTAIN(x) ((x)!=ENC_UNCERTAIN)
805 int x, y, i, j, k, x2, y2, x3, y3,
plane,
shift, mbn;
809 int64_t total_error = 0;
811 uint8_t *sub_data [4], *vq_data [4];
812 int sub_linesize[4], vq_linesize[4];
814 for(mbn = i = y = 0; y <
h; y +=
MB_SIZE) {
815 for(x = 0; x < s->
w; x +=
MB_SIZE, ++mbn) {
826 for(j = y2 = 0; y2 < entry_size; y2 += 2) {
827 for(x2 = 0; x2 < 4; x2 += 2, j++) {
828 plane = y2 < 4 ? 0 : 1 + (x2 >> 1);
829 shift = y2 < 4 ? 0 : 1;
832 base[j] = (data[
plane][((x+x3) >> shift) + ((y+y3) >> shift) * linesize[
plane]] +
833 data[
plane][((x+x3) >> shift) + 1 + ((y+y3) >> shift) * linesize[
plane]] +
834 data[
plane][((x+x3) >> shift) + (((y+y3) >> shift) + 1) * linesize[plane]] +
835 data[plane][((x+x3) >>
shift) + 1 + (((y+y3) >>
shift) + 1) * linesize[
plane]]) >> 2;
840 for(j = y2 = 0; y2 <
MB_SIZE; y2 += 2) {
841 for(x2 = 0; x2 <
MB_SIZE; x2 += 2) {
842 for(k = 0; k < entry_size; k++, j++) {
843 plane = k >= 4 ? k - 3 : 0;
849 x3 = x + x2 + (k & 1);
850 y3 = y + y2 + (k >> 1);
853 base[j] = data[
plane][x3 + y3*linesize[
plane]];
876 vq_data[0] = vq_pict_buf;
878 vq_data[1] = &vq_pict_buf[
MB_AREA];
879 vq_data[2] = vq_data[1] + (
MB_AREA >> 2);
880 vq_linesize[1] = vq_linesize[2] =
MB_SIZE >> 1;
883 for(i = j = y = 0; y <
h; y +=
MB_SIZE) {
884 for(x = 0; x < s->
w; x +=
MB_SIZE, j++) {
900 vq_data, vq_linesize);
903 for(k = 0; k < 4; k++)
910 vq_data, vq_linesize);
925 uint8_t *last_data[4],
int last_linesize[4],
930 uint8_t *sub_last_data [4], *sub_pict_data [4];
931 int sub_last_linesize[4], sub_pict_linesize[4];
933 for(i = y = 0; y <
h; y +=
MB_SIZE) {
934 for(x = 0; x < s->
w; x +=
MB_SIZE, i++) {
936 sub_last_data, sub_last_linesize);
938 sub_pict_data, sub_pict_linesize);
941 sub_last_data, sub_last_linesize,
942 sub_pict_data, sub_pict_linesize);
954 buf[0] = keyframe ? 0x10: 0x11;
966 uint8_t *last_data[4],
int last_linesize[4],
968 uint8_t *scratch_data[4],
int scratch_linesize[4],
969 unsigned char *
buf, int64_t *best_score
970 #ifdef CINEPAK_REPORT_SERR
976 #ifdef CINEPAK_REPORT_SERR
982 int v1enough, v1_size, v4enough, v4_size;
983 int new_v1_size, new_v4_size;
984 int v1shrunk, v4shrunk;
994 #define SMALLEST_CODEBOOK 1
996 for(v4enough = 0, v4_size = 0; v4_size <= v1_size && !v4enough; v4_size = v4_size ? v4_size << 2 : v1_size >= SMALLEST_CODEBOOK << 2 ? v1_size >> 2 :
SMALLEST_CODEBOOK) {
1031 &v1shrunk, &v4shrunk
1032 #ifdef CINEPAK_REPORT_SERR
1043 if(new_v1_size < info.
v1_size){
1050 if(new_v4_size < info.
v4_size) {
1060 &v1shrunk, &v4shrunk
1061 #ifdef CINEPAK_REPORT_SERR
1066 if((!v1shrunk && !v4shrunk) || !extra_iterations_limit--)
break;
1071 if(new_v1_size < info.
v1_size){
1079 if(new_v4_size < info.
v4_size) {
1089 if(best_size == 0 || score < *best_score) {
1091 *best_score = score;
1092 #ifdef CINEPAK_REPORT_SERR
1096 scratch_data, scratch_linesize,
1097 last_data, last_linesize, &info,
1102 #ifdef CINEPAK_REPORT_SERR
1106 #ifdef CINEPAKENC_DEBUG
1108 memcpy(s->best_mb, s->
mb, mb_count*
sizeof(
mb_info));
1119 #ifdef CINEPAKENC_DEBUG
1131 for(x = 0; x < s->
w*h/
MB_AREA; x++)
1132 if(s->best_mb[x].best_encoding ==
ENC_V1)
1134 else if(s->best_mb[x].best_encoding ==
ENC_V4)
1149 buf[0] = isakeyframe ? 0 : 1;
1159 int isakeyframe,
unsigned char *
buf,
int buf_size)
1161 int num_strips, strip, i, y, nexty,
size, temp_size;
1162 uint8_t *last_data [4], *
data [4], *scratch_data [4];
1163 int last_linesize[4], linesize[4], scratch_linesize[4];
1164 int64_t best_score = 0, score, score_temp;
1165 #ifdef CINEPAK_REPORT_SERR
1166 int64_t best_serr = 0, serr, serr_temp;
1169 int best_nstrips = -1, best_size = -1;
1174 for(y = 0; y < s->
h; y += 2) {
1175 for(x = 0; x < s->
w; x += 2) {
1178 ir[1] = ir[0] + frame->
linesize[0];
1181 scratch_data, scratch_linesize);
1183 for(i=0; i<4; ++i) {
1185 i1 = (i&1); i2 = (i>=2);
1186 rr = ir[i2][i1*3+0];
1187 gg = ir[i2][i1*3+1];
1188 bb = ir[i2][i1*3+2];
1189 r += rr; g += gg; b += bb;
1193 rr = (2396625*rr + 4793251*gg + 1198732*bb) >> 23;
1195 else if (rr > 255) rr = 255;
1196 scratch_data[0][i1 + i2*scratch_linesize[0]] = rr;
1202 rr = (-299683*r - 599156*g + 898839*
b) >> 23;
1203 if( rr < -128) rr = -128;
1204 else if (rr > 127) rr = 127;
1205 scratch_data[1][0] = rr + 128;
1208 rr = (748893*r - 599156*g - 149737*
b) >> 23;
1209 if( rr < -128) rr = -128;
1210 else if (rr > 127) rr = 127;
1211 scratch_data[2][0] = rr + 128;
1218 for(num_strips = s->
min_strips; num_strips <= s->max_strips && num_strips <= s->
h /
MB_SIZE; num_strips++) {
1221 #ifdef CINEPAK_REPORT_SERR
1225 for(y = 0, strip = 1; y < s->
h; strip++, y = nexty) {
1228 nexty = strip * s->
h / num_strips;
1231 nexty += 4 - (nexty & 3);
1233 strip_height = nexty - y;
1234 if(strip_height <= 0) {
1249 last_data, last_linesize);
1252 scratch_data, scratch_linesize);
1254 if((temp_size =
rd_strip(s, y, strip_height, isakeyframe,
1255 last_data, last_linesize, data, linesize,
1256 scratch_data, scratch_linesize,
1258 #ifdef CINEPAK_REPORT_SERR
1264 score += score_temp;
1265 #ifdef CINEPAK_REPORT_SERR
1273 if(best_score == 0 || score < best_score) {
1275 #ifdef CINEPAK_REPORT_SERR
1280 #ifdef CINEPAK_REPORT_SERR
1281 av_log(s->
avctx,
AV_LOG_INFO,
"best number of strips so far: %2i, %12"PRId64
", %i B\n", num_strips, serr, best_size);
1286 best_nstrips = num_strips;
1290 if(num_strips - best_nstrips > 4)
1294 av_assert0(best_nstrips >= 0 && best_size >= 0);
1361 #ifdef CINEPAKENC_DEBUG
1368 #ifdef CINEPAKENC_DEBUG
1369 av_log(avctx,
AV_LOG_INFO,
"strip coding stats: %i V1 mode, %i V4 mode, %i MC mode (%i V1 encs, %i V4 encs, %i skips)\n",
1370 s->num_v1_mode, s->num_v4_mode, s->num_mc_mode, s->num_v1_encs, s->num_v4_encs, s->num_skips);
static enum AVPixelFormat pix_fmt
static int shift(int a, int b)
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static void calculate_skip_errors(CinepakEncContext *s, int h, uint8_t *last_data[4], int last_linesize[4], uint8_t *data[4], int linesize[4], strip_info *info)
#define LIBAVUTIL_VERSION_INT
packed RGB 8:8:8, 24bpp, RGBRGB...
static av_cold int init(AVCodecContext *avctx)
static int cinepak_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
static void write_strip_header(CinepakEncContext *s, int y, int h, int keyframe, unsigned char *buf, int strip_size)
int strip_number_delta_range
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static void get_sub_picture(CinepakEncContext *s, int x, int y, uint8_t *in_data[4], int in_linesize[4], uint8_t *out_data[4], int out_linesize[4])
int v1_codebook[CODEBOOK_MAX *VECTOR_MAX]
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int compute_mb_distortion(CinepakEncContext *s, uint8_t *a_data[4], int a_linesize[4], uint8_t *b_data[4], int b_linesize[4])
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define CHUNK_HEADER_SIZE
static int rd_strip(CinepakEncContext *s, int y, int h, int keyframe, uint8_t *last_data[4], int last_linesize[4], uint8_t *data[4], int linesize[4], uint8_t *scratch_data[4], int scratch_linesize[4], unsigned char *buf, int64_t *best_score)
int avpriv_do_elbg(int *points, int dim, int numpoints, int *codebook, int numCB, int max_steps, int *closest_cb, AVLFG *rand_state)
Implementation of the Enhanced LBG Algorithm Based on the paper "Neural Networks 14:1219-1237" that c...
#define SMALLEST_CODEBOOK
int v4_codebook[CODEBOOK_MAX *VECTOR_MAX]
static const AVOption options[]
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
unsigned char * frame_buf
static void copy_mb(CinepakEncContext *s, uint8_t *a_data[4], int a_linesize[4], uint8_t *b_data[4], int b_linesize[4])
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
static void decode_v1_vector(CinepakEncContext *s, uint8_t *data[4], int linesize[4], int v1_vector, strip_info *info)
int flags
A combination of AV_PKT_FLAG values.
static av_cold int cinepak_encode_init(AVCodecContext *avctx)
int width
picture width / height.
static int write_chunk_header(unsigned char *buf, int chunk_type, int chunk_size)
static void decode_v4_vector(CinepakEncContext *s, uint8_t *data[4], int linesize[4], int *v4_vector, strip_info *info)
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
#define AV_LOG_INFO
Standard information.
mb_encoding best_encoding
int avpriv_init_elbg(int *points, int dim, int numpoints, int *codebook, int numCB, int max_steps, int *closest_cb, AVLFG *rand_state)
Initialize the **codebook vector for the elbg algorithm.
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
AVCodec ff_cinepak_encoder
Describe the class of an AVClass context structure.
#define STRIP_HEADER_SIZE
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static int encode_codebook(CinepakEncContext *s, int *codebook, int size, int chunk_type_yuv, int chunk_type_gray, unsigned char *buf)
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
static int encode_mode(CinepakEncContext *s, int h, uint8_t *scratch_data[4], int scratch_linesize[4], uint8_t *last_data[4], int last_linesize[4], strip_info *info, unsigned char *buf)
static const AVClass cinepak_class
static enum AVPixelFormat pix_fmts[]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int max_extra_cb_iterations
common internal api header.
static int quantize(CinepakEncContext *s, int h, uint8_t *data[4], int linesize[4], int v1mode, strip_info *info, mb_encoding encoding)
unsigned char * strip_buf
unsigned char * pict_bufs[4]
static int rd_frame(CinepakEncContext *s, const AVFrame *frame, int isakeyframe, unsigned char *buf, int buf_size)
static int64_t calculate_mode_score(CinepakEncContext *s, int h, strip_info *info, int report, int *training_set_v1_shrunk, int *training_set_v4_shrunk)
#define av_malloc_array(a, b)
#define FFSWAP(type, a, b)
AVPixelFormat
Pixel format.
This structure stores compressed data.
enum AVPixelFormat pix_fmt
mode
Use these values in ebur128_init (or'ed).
static av_cold int cinepak_encode_end(AVCodecContext *avctx)
static int write_cvid_header(CinepakEncContext *s, unsigned char *buf, int num_strips, int data_size, int isakeyframe)
int keyint_min
minimum GOP size