* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
+#define _LARGEFILE_SOURCE
+#define _FILE_OFFSET_BITS 64
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h> /* _O_BINARY */
#endif
+#ifndef _MSC_VER
+#include "config.h"
+#endif
+
#ifdef AVIS_INPUT
#include <windows.h>
#include <vfw.h>
#include "common/common.h"
#include "x264.h"
-#ifndef _MSC_VER
-#include "config.h"
-#endif
-
#include "matroska.h"
#define DATA_MAX 3000000
typedef struct {
int b_decompress;
int b_progress;
- int i_maxframes;
int i_seek;
hnd_t hin;
hnd_t hout;
return Encode( ¶m, &opt );
}
+static const char * const overscan_str[] = { "undef", "show", "crop", NULL };
+static const char * const vidformat_str[] = { "component", "pal", "ntsc", "secam", "mac", "undef", NULL };
+static const char * const fullrange_str[] = { "off", "on", NULL };
+static const char * const colorprim_str[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film", NULL };
+static const char * const transfer_str[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316", NULL };
+static const char * const colmatrix_str[] = { "GBR", "bt709", "undef", "", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", NULL };
+
+static char const *strtable_lookup( const char * const table[], int index )
+{
+ int i = 0; while( table[i] ) i++;
+ return ( ( index >= 0 && index < i ) ? table[ index ] : "???" );
+}
+
/*****************************************************************************
* Help:
*****************************************************************************/
"\n"
" -q, --qp <integer> Set QP (0=lossless) [%d]\n"
" -B, --bitrate <integer> Set bitrate\n"
+ " --crf <integer> Quality-based VBR (nominal QP)\n"
" --qpmin <integer> Set min QP [%d]\n"
" --qpmax <integer> Set max QP [%d]\n"
" --qpstep <integer> Set max QP step [%d]\n"
" - p8x8, p4x4, b8x8, i8x8, i4x4\n"
" - none, all\n"
" (p4x4 requires p8x8. i8x8 requires --8x8dct.)\n"
- " --direct <string> Direct MV prediction mode [\"temporal\"]\n"
+ " --direct <string> Direct MV prediction mode [\"%s\"]\n"
" - none, spatial, temporal\n"
" -w, --weightb Weighted prediction for B-frames\n"
" --me <string> Integer pixel motion estimation method [\"%s\"]\n"
" --merange <integer> Maximum motion vector search range [%d]\n"
" -m, --subme <integer> Subpixel motion estimation and partition\n"
" decision quality: 1=fast, 6=best. [%d]\n"
+ " --b-rdo RD based mode decision for B-frames. Requires subme 6.\n"
+ " --mixed-refs Decide references on a per partition basis\n"
" --no-chroma-me Ignore chroma in motion estimation\n"
+ " --bime Jointly optimize both MVs in B-frames\n"
" -8, --8x8dct Adaptive spatial transform size\n"
+ " -t, --trellis <integer> Trellis RD quantization. Requires CABAC. [%d]\n"
+ " - 0: disabled\n"
+ " - 1: enabled only on the final encode of a MB\n"
+ " - 2: enabled on all mode decisions\n"
+ " --no-fast-pskip Disables early SKIP detection on P-frames\n"
+ " --nr <integer> Noise reduction [%d]\n"
"\n"
" --cqm <string> Preset quant matrices [\"flat\"]\n"
" - jvt, flat\n"
" --cqm4iy, --cqm4ic, --cqm4py, --cqm4pc\n"
" Set individual quant matrices\n"
"\n"
- "Input/Output:\n"
+ "Video Usability Info (Annex E):\n"
+ "The VUI settings are not used by the encoder but are merely suggestions to\n"
+ "the playback equipment. See doc/vui.txt for details. Use at your own risk.\n"
"\n"
- " --level <integer> Specify level (as defined by Annex A)\n"
" --sar width:height Specify Sample Aspect Ratio\n"
+ " --overscan <string> Specify crop overscan setting [\"%s\"]\n"
+ " - undef, show, crop\n"
+ " --videoformat <string> Specify video format [\"%s\"]\n"
+ " - component, pal, ntsc, secam, mac, undef\n"
+ " --fullrange <string> Specify full range samples setting [\"%s\"]\n"
+ " - off, on\n"
+ " --colorprim <string> Specify color primaries [\"%s\"]\n"
+ " - undef, bt709, bt470m, bt470bg\n"
+ " smpte170m, smpte240m, film\n"
+ " --transfer <string> Specify transfer characteristics [\"%s\"]\n"
+ " - undef, bt709, bt470m, bt470bg, linear,\n"
+ " log100, log316, smpte170m, smpte240m\n"
+ " --colormatrix <string> Specify color matrix setting [\"%s\"]\n"
+ " - undef, bt709, fcc, bt470bg\n"
+ " smpte170m, smpte240m, GBR, YCgCo\n"
+ " --chromaloc <integer> Specify chroma sample location (0 to 5) [%d]\n"
+ "\n"
+ "Input/Output:\n"
+ "\n"
+ " --level <string> Specify level (as defined by Annex A)\n"
" --fps <float|rational> Specify framerate\n"
" --seek <integer> First frame to encode\n"
" --frames <integer> Maximum number of frames to encode\n"
defaults->rc.f_qcompress,
defaults->rc.f_complexity_blur,
defaults->rc.f_qblur,
- defaults->analyse.i_me_method==X264_ME_DIA ? "dia"
- : defaults->analyse.i_me_method==X264_ME_HEX ? "hex"
- : defaults->analyse.i_me_method==X264_ME_UMH ? "umh"
- : defaults->analyse.i_me_method==X264_ME_ESA ? "esa" : NULL,
+ strtable_lookup( x264_direct_pred_names, defaults->analyse.i_direct_mv_pred ),
+ strtable_lookup( x264_motion_est_names, defaults->analyse.i_me_method ),
defaults->analyse.i_me_range,
- defaults->analyse.i_subpel_refine
+ defaults->analyse.i_subpel_refine,
+ defaults->analyse.i_trellis,
+ defaults->analyse.i_noise_reduction,
+ strtable_lookup( overscan_str, defaults->vui.i_overscan ),
+ strtable_lookup( vidformat_str, defaults->vui.i_vidformat ),
+ strtable_lookup( fullrange_str, defaults->vui.b_fullrange ),
+ strtable_lookup( colorprim_str, defaults->vui.i_colorprim ),
+ strtable_lookup( transfer_str, defaults->vui.i_transfer ),
+ strtable_lookup( colmatrix_str, defaults->vui.i_colmatrix ),
+ defaults->vui.i_chroma_loc
);
}
+static int parse_enum( const char *arg, const char * const *names, int *dst )
+{
+ int i;
+ for( i = 0; names[i]; i++ )
+ if( !strcmp( arg, names[i] ) )
+ {
+ *dst = i;
+ return 0;
+ }
+ return -1;
+}
+
static int parse_cqm( const char *str, uint8_t *cqm, int length )
{
int i = 0;
#define OPT_CQM8I 303
#define OPT_CQM8P 304
#define OPT_CQMFILE 305
+#define OPT_SAR 306
+#define OPT_OVERSCAN 307
+#define OPT_VIDFORMAT 308
+#define OPT_FULLRANGE 309
+#define OPT_COLOURPRIM 310
+#define OPT_TRANSFER 311
+#define OPT_COLOURMATRIX 312
+#define OPT_CHROMALOC 313
+#define OPT_MIXED_REFS 314
+#define OPT_CRF 315
+#define OPT_B_RDO 316
+#define OPT_NO_FAST_PSKIP 317
+#define OPT_BIME 318
+#define OPT_NR 319
static struct option long_options[] =
{
{ "qpmin", required_argument, NULL, OPT_QPMIN },
{ "qpmax", required_argument, NULL, OPT_QPMAX },
{ "qpstep", required_argument, NULL, OPT_QPSTEP },
+ { "crf", required_argument, NULL, OPT_CRF },
{ "ref", required_argument, NULL, 'r' },
{ "no-asm", no_argument, NULL, 'C' },
- { "sar", required_argument, NULL, 's' },
+ { "sar", required_argument, NULL, OPT_SAR },
{ "fps", required_argument, NULL, OPT_FPS },
{ "frames", required_argument, NULL, OPT_FRAMES },
{ "seek", required_argument, NULL, OPT_SEEK },
{ "me", required_argument, NULL, OPT_ME },
{ "merange", required_argument, NULL, OPT_MERANGE },
{ "subme", required_argument, NULL, 'm' },
+ { "b-rdo", no_argument, NULL, OPT_B_RDO },
+ { "mixed-refs", no_argument, NULL, OPT_MIXED_REFS },
{ "no-chroma-me", no_argument, NULL, OPT_NO_CHROMA_ME },
+ { "bime", no_argument, NULL, OPT_BIME },
{ "8x8dct", no_argument, NULL, '8' },
+ { "trellis", required_argument, NULL, 't' },
+ { "no-fast-pskip", no_argument, NULL, OPT_NO_FAST_PSKIP },
{ "level", required_argument, NULL, OPT_LEVEL },
{ "ratetol", required_argument, NULL, OPT_RATETOL },
{ "vbv-maxrate", required_argument, NULL, OPT_VBVMAXRATE },
{ "progress",no_argument, NULL, OPT_PROGRESS },
{ "visualize",no_argument, NULL, OPT_VISUALIZE },
{ "aud", no_argument, NULL, OPT_AUD },
+ { "nr", required_argument, NULL, OPT_NR },
{ "cqm", required_argument, NULL, OPT_CQM },
{ "cqmfile", required_argument, NULL, OPT_CQMFILE },
{ "cqm4", required_argument, NULL, OPT_CQM4 },
{ "cqm8", required_argument, NULL, OPT_CQM8 },
{ "cqm8i", required_argument, NULL, OPT_CQM8I },
{ "cqm8p", required_argument, NULL, OPT_CQM8P },
+ { "overscan", required_argument, NULL, OPT_OVERSCAN },
+ { "videoformat", required_argument, NULL, OPT_VIDFORMAT },
+ { "fullrange", required_argument, NULL, OPT_FULLRANGE },
+ { "colorprim", required_argument, NULL, OPT_COLOURPRIM },
+ { "transfer", required_argument, NULL, OPT_TRANSFER },
+ { "colormatrix", required_argument, NULL, OPT_COLOURMATRIX },
+ { "chromaloc", required_argument, NULL, OPT_CHROMALOC },
{0, 0, 0, 0}
};
int c;
- c = getopt_long( argc, argv, "hi:I:b:r:cxB:q:f:o:A:m:p:vw8",
+ c = getopt_long( argc, argv, "hi:I:b:r:cxB:q:f:o:A:m:p:t:vw8",
long_options, &long_options_index);
if( c == -1 )
param->rc.i_bitrate = atol( optarg );
param->rc.b_cbr = 1;
break;
+ case OPT_CRF:
+ param->rc.i_rf_constant = atol( optarg );
+ break;
case 'b':
param->i_bframe = atol( optarg );
break;
case 'f':
{
char *p = strchr( optarg, ':' );
+ if( !p ) p = strchr( optarg, ',' );
param->i_deblocking_filter_alphac0 = atoi( optarg );
param->i_deblocking_filter_beta = p ? atoi( p+1 ) : param->i_deblocking_filter_alphac0;
break;
param->cpu = 0;
break;
case OPT_FRAMES:
- opt->i_maxframes = atoi( optarg );
+ param->i_frame_total = atoi( optarg );
break;
case OPT_SEEK:
opt->i_seek = atoi( optarg );
return -1;
}
break;
- case 's':
+ case OPT_SAR:
{
char *p = strchr( optarg, ':' );
+ if( !p ) p = strchr( optarg, '/' );
if( p )
{
param->vui.i_sar_width = atoi( optarg );
if( strstr( optarg, "b8x8" ) ) param->analyse.inter |= X264_ANALYSE_BSUB16x16;
break;
case OPT_DIRECT:
- if( strstr( optarg, "temporal" ) )
- param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_TEMPORAL;
- else if( strstr( optarg, "spatial" ) )
- param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
- else if( strstr( optarg, "none" ) )
- param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_NONE;
- else
- param->analyse.i_direct_mv_pred = atoi( optarg );
+ b_error |= parse_enum( optarg, x264_direct_pred_names, ¶m->analyse.i_direct_mv_pred );
break;
case 'w':
param->analyse.b_weighted_bipred = 1;
break;
case OPT_ME:
- param->analyse.i_me_method =
- strstr( optarg, "dia" ) ? X264_ME_DIA :
- strstr( optarg, "hex" ) ? X264_ME_HEX :
- strstr( optarg, "umh" ) ? X264_ME_UMH :
- strstr( optarg, "esa" ) ? X264_ME_ESA : -1;
- if( param->analyse.i_me_method == -1 )
- {
- fprintf( stderr, "bad ME method `%s'\n", optarg );
- return -1;
- }
+ b_error |= parse_enum( optarg, x264_motion_est_names, ¶m->analyse.i_me_method );
break;
case OPT_MERANGE:
param->analyse.i_me_range = atoi(optarg);
case 'm':
param->analyse.i_subpel_refine = atoi(optarg);
break;
+ case OPT_B_RDO:
+ param->analyse.b_bframe_rdo = 1;
+ break;
+ case OPT_MIXED_REFS:
+ param->analyse.b_mixed_references = 1;
+ break;
case OPT_NO_CHROMA_ME:
param->analyse.b_chroma_me = 0;
break;
+ case OPT_BIME:
+ param->analyse.b_bidir_me = 1;
+ break;
case '8':
param->analyse.b_transform_8x8 = 1;
break;
+ case 't':
+ param->analyse.i_trellis = atoi(optarg);
+ break;
+ case OPT_NO_FAST_PSKIP:
+ param->analyse.b_fast_pskip = 0;
+ break;
case OPT_LEVEL:
- param->i_level_idc = atoi(optarg);
+ if( atof(optarg) < 6 )
+ param->i_level_idc = (int)(10*atof(optarg)+.5);
+ else
+ param->i_level_idc = atoi(optarg);
break;
case OPT_RATETOL:
param->rc.f_rate_tolerance = !strncmp("inf", optarg, 3) ? 1e9 : atof(optarg);
fprintf( stderr, "not compiled with visualization support\n" );
#endif
break;
+ case OPT_NR:
+ param->analyse.i_noise_reduction = atoi(optarg);
+ break;
case OPT_CQM:
if( strstr( optarg, "flat" ) )
param->i_cqm_preset = X264_CQM_FLAT;
break;
case OPT_CQM4PY:
param->i_cqm_preset = X264_CQM_CUSTOM;
- b_error |= parse_cqm( optarg, param->cqm_4iy, 16 );
+ b_error |= parse_cqm( optarg, param->cqm_4py, 16 );
break;
case OPT_CQM4PC:
param->i_cqm_preset = X264_CQM_CUSTOM;
- b_error |= parse_cqm( optarg, param->cqm_4ic, 16 );
+ b_error |= parse_cqm( optarg, param->cqm_4pc, 16 );
break;
case OPT_CQM8I:
param->i_cqm_preset = X264_CQM_CUSTOM;
param->i_cqm_preset = X264_CQM_CUSTOM;
b_error |= parse_cqm( optarg, param->cqm_8py, 64 );
break;
+ case OPT_OVERSCAN:
+ b_error |= parse_enum( optarg, overscan_str, ¶m->vui.i_overscan );
+ break;
+ case OPT_VIDFORMAT:
+ b_error |= parse_enum( optarg, vidformat_str, ¶m->vui.i_vidformat );
+ break;
+ case OPT_FULLRANGE:
+ b_error |= parse_enum( optarg, fullrange_str, ¶m->vui.b_fullrange );
+ break;
+ case OPT_COLOURPRIM:
+ b_error |= parse_enum( optarg, colorprim_str, ¶m->vui.i_colorprim );
+ break;
+ case OPT_TRANSFER:
+ b_error |= parse_enum( optarg, transfer_str, ¶m->vui.i_transfer );
+ break;
+ case OPT_COLOURMATRIX:
+ b_error |= parse_enum( optarg, colmatrix_str, ¶m->vui.i_colmatrix );
+ break;
+ case OPT_CHROMALOC:
+ param->vui.i_chroma_loc = atoi( optarg );
+ b_error = ( param->vui.i_chroma_loc < 0 || param->vui.i_chroma_loc > 5 );
+ break;
default:
fprintf( stderr, "unknown option (%c)\n", optopt );
return -1;
if( b_error )
{
- fprintf( stderr, "bad argument (%s)\n", optarg );
+ fprintf( stderr, "bad argument: %s %s\n", argv[optind-2], optarg );
return -1;
}
}
/*****************************************************************************
* Decode:
*****************************************************************************/
-#if 0
-static int Decode( x264_param_t *param, FILE *fh26l, hnd_t hout )
-{
- fprintf( stderr, "decompressor not working (help is welcome)\n" );
- return -1;
- x264_nal_t nal;
- int i_data;
- int b_eof;
-
- //param.cpu = 0;
- if( ( h = x264_decoder_open( ¶m ) ) == NULL )
- {
- fprintf( stderr, "x264_decoder_open failed\n" );
- return -1;
- }
-
- i_start = x264_mdate();
- b_eof = 0;
- i_frame = 0;
- i_data = 0;
- nal.p_payload = malloc( DATA_MAX );
-
- while( !b_ctrl_c )
- {
- uint8_t *p, *p_next, *end;
- int i_size;
- /* fill buffer */
- if( i_data < DATA_MAX && !b_eof )
- {
- int i_read = fread( &data[i_data], 1, DATA_MAX - i_data, fh26l );
- if( i_read <= 0 )
- {
- b_eof = 1;
- }
- else
- {
- i_data += i_read;
- }
- }
-
- if( i_data < 3 )
- {
- break;
- }
-
- end = &data[i_data];
-
- /* extract one nal */
- p = &data[0];
- while( p < end - 3 )
- {
- if( p[0] == 0x00 && p[1] == 0x00 && p[2] == 0x01 )
- {
- break;
- }
- p++;
- }
-
- if( p >= end - 3 )
- {
- fprintf( stderr, "garbage (i_data = %d)\n", i_data );
- i_data = 0;
- continue;
- }
-
- p_next = p + 3;
- while( p_next < end - 3 )
- {
- if( p_next[0] == 0x00 && p_next[1] == 0x00 && p_next[2] == 0x01 )
- {
- break;
- }
- p_next++;
- }
-
- if( p_next == end - 3 && i_data < DATA_MAX )
- {
- p_next = end;
- }
-
- /* decode this nal */
- i_size = p_next - p - 3;
- if( i_size <= 0 )
- {
- if( b_eof )
- {
- break;
- }
- fprintf( stderr, "nal too large (FIXME) ?\n" );
- i_data = 0;
- continue;
- }
-
- x264_nal_decode( &nal, p +3, i_size );
-
- /* decode the content of the nal */
- x264_decoder_decode( h, &pic, &nal );
-
- if( pic != NULL )
- {
- int i;
-
- i_frame++;
-
- for( i = 0; i < pic->i_plane;i++ )
- {
- int i_line;
- int i_div;
-
- i_div = i==0 ? 1 : 2;
- for( i_line = 0; i_line < pic->i_height/i_div; i_line++ )
- {
- fwrite( pic->plane[i]+i_line*pic->i_stride[i], 1, pic->i_width/i_div, hout );
- }
- }
- }
-
- memmove( &data[0], p_next, end - p_next );
- i_data -= p_next - &data[0];
- }
-
- i_end = x264_mdate();
- free( nal.p_payload );
- fprintf( stderr, "\n" );
-
- x264_decoder_close( h );
-
- fclose( fh26l );
- if( hout != stdout )
- {
- fclose( hout );
- }
- if( i_frame > 0 )
- {
- double fps = (double)i_frame * (double)1000000 /
- (double)( i_end - i_start );
- fprintf( stderr, "decoded %d frames %ffps\n", i_frame, fps );
- }
-}
-#endif
static int Encode_frame( x264_t *h, hnd_t hout, x264_picture_t *pic )
{
int i_progress;
i_frame_total = p_get_frame_total( opt->hin, param->i_width, param->i_height );
+ i_frame_total -= opt->i_seek;
+ if( ( i_frame_total == 0 || param->i_frame_total < i_frame_total )
+ && param->i_frame_total > 0 )
+ i_frame_total = param->i_frame_total;
+ param->i_frame_total = i_frame_total;
if( ( h = x264_encoder_open( param ) ) == NULL )
{
x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height );
i_start = x264_mdate();
+
/* Encode frames */
- i_frame_total -= opt->i_seek;
- if( opt->i_maxframes > 0 && opt->i_maxframes < i_frame_total )
- i_frame_total = opt->i_maxframes;
for( i_frame = 0, i_file = 0, i_progress = 0;
b_ctrl_c == 0 && (i_frame < i_frame_total || i_frame_total == 0); )
{
double fps = i_elapsed > 0 ? i_frame * 1000000. / i_elapsed : 0;
if( i_frame_total )
{
+ int eta = i_elapsed * (i_frame_total - i_frame) / ((int64_t)i_frame * 1000000);
i_progress = i_frame * 1000 / i_frame_total;
- fprintf( stderr, "encoded frames: %d/%d (%.1f%%), %.2f fps \r", i_frame,
- i_frame_total, (float)i_progress / 10, fps );
+ fprintf( stderr, "encoded frames: %d/%d (%.1f%%), %.2f fps, eta %d:%02d:%02d \r",
+ i_frame, i_frame_total, (float)i_progress / 10, fps,
+ eta/3600, (eta/60)%60, eta%60 );
}
else
fprintf( stderr, "encoded frames: %d, %.2f fps \r", i_frame, fps );
(double)( i_end - i_start );
fprintf( stderr, "encoded %d frames, %.2f fps, %.2f kb/s\n", i_frame, fps,
- (double) i_file * 8 * param->i_fps_num / ( param->i_fps_den * i_frame * 1000 ) );
+ (double) i_file * 8 * param->i_fps_num /
+ ( (double) param->i_fps_den * i_frame * 1000 ) );
}
return 0;
if( !fseek( f, 0, SEEK_END ) )
{
- int64_t i_size = ftell( f );
+ uint64_t i_size = ftell( f );
fseek( f, 0, SEEK_SET );
i_frame_total = (int)(i_size / ( i_width * i_height * 3 / 2 ));
}
FILE *f = (FILE *)handle;
if( i_frame != prev_frame+1 )
- if( fseek( f, i_frame * i_width * i_height * 3 / 2, SEEK_SET ) )
+ if( fseek( f, (uint64_t)i_frame * i_width * i_height * 3 / 2, SEEK_SET ) )
return -1;
if( fread( p_pic->img.plane[0], 1, i_width * i_height, f ) <= 0
gf_isom_avc_config_new(p_mp4->p_file, p_mp4->i_track, p_mp4->p_config,
NULL, NULL, &p_mp4->i_descidx);
+ gf_isom_set_track_enabled(p_mp4->p_file, p_mp4->i_track, 1);
+
gf_isom_set_visual_info(p_mp4->p_file, p_mp4->i_track, p_mp4->i_descidx,
p_param->i_width, p_param->i_height);
static int set_eop_mp4( hnd_t handle, x264_picture_t *p_picture )
{
mp4_t *p_mp4 = (mp4_t *)handle;
- uint32_t dts = p_mp4->i_numframe * p_mp4->i_time_inc;
- uint32_t pts = p_picture->i_pts;
- int offset = p_mp4->i_init_delay + pts - dts;
+ uint64_t dts = (uint64_t)p_mp4->i_numframe * p_mp4->i_time_inc;
+ uint64_t pts = (uint64_t)p_picture->i_pts;
+ int32_t offset = p_mp4->i_init_delay + pts - dts;
p_mp4->p_sample->IsRAP = p_picture->i_type == X264_TYPE_IDR ? 1 : 0;
p_mp4->p_sample->DTS = dts;
avcC[1] = p_mkv->sps[1];
avcC[2] = p_mkv->sps[2];
avcC[3] = p_mkv->sps[3];
- avcC[4] = 0xfe; // nalu size length is three bytes
+ avcC[4] = 0xff; // nalu size length is four bytes
avcC[5] = 0xe1; // one sps
avcC[6] = p_mkv->sps_len >> 8;
{
mkv_t *p_mkv = handle;
uint8_t type = p_nalu[4] & 0x1f;
- uint8_t dsize[3];
+ uint8_t dsize[4];
int psize;
switch( type )
p_mkv->b_writing_frame = 1;
}
psize = i_size - 4 ;
- dsize[0] = psize >> 16;
- dsize[1] = psize >> 8;
- dsize[2] = psize;
- if( mk_addFrameData(p_mkv->w, dsize, 3) < 0 ||
+ dsize[0] = psize >> 24;
+ dsize[1] = psize >> 16;
+ dsize[2] = psize >> 8;
+ dsize[3] = psize;
+ if( mk_addFrameData(p_mkv->w, dsize, 4) < 0 ||
mk_addFrameData(p_mkv->w, p_nalu + 4, i_size - 4) < 0 )
return -1;
break;