diff options
-rw-r--r-- | libmkv/nut-3.c | 115 |
1 files changed, 54 insertions, 61 deletions
diff --git a/libmkv/nut-3.c b/libmkv/nut-3.c index 2bd552d..0441400 100644 --- a/libmkv/nut-3.c +++ b/libmkv/nut-3.c @@ -270,76 +270,70 @@ bool app_write_intro(int fd, struct app_state *state, uint64_t time_ns) { pkt.len = 0; /* head *******************************************/ - nut_append_vu(&pkt, 4); /*! version */ - nut_append_vu(&pkt, 0); /*! minor_version */ - nut_append_vu(&pkt, 1); /*! stream_count */ - nut_append_vu(&pkt, APP_FB_SIZE(720_576) + /*! max_distance */ + nut_append_vu(&pkt, 4); /*! version */ + nut_append_vu(&pkt, 0); /*! minor_version */ + nut_append_vu(&pkt, 1); /*! stream_count */ + nut_append_vu(&pkt, APP_FB_SIZE(720_576) + /*! max_distance */ APP_FRAME_MAX_OVERHEAD); /* time bases *************************************/ - nut_append_vu(&pkt, 1); /*! time_base_count */ + nut_append_vu(&pkt, 1); /*! time_base_count */ /* time_base[0] = 1ns */ - nut_append_vu(&pkt, 1); /*! numerator */ - nut_append_vu(&pkt, 1000000000ULL); /*! denominator */ + nut_append_vu(&pkt, 1); /*! numerator */ + nut_append_vu(&pkt, 1000000000ULL); /*! denominator */ /* frame codes ************************************/ /* "A muxer SHOULD mark [frame codes] 0x00 and 0xFF as invalid" */ /* frame_code=0 (invalid) */ - nut_append_vu(&pkt, NUT_FRAMEFLAG_INVALID); /*! flags */ - nut_append_vu(&pkt, 2); /*! field_count */ - nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ - nut_append_vu(&pkt, 1); /*! 1: fields.size_msb_nul */ + nut_append_vu(&pkt, NUT_FRAMEFLAG_INVALID); /*! flags */ + nut_append_vu(&pkt, 2); /*! field_count */ + nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ + nut_append_vu(&pkt, 1); /*! 1: fields.size_msb_nul */ /* frame_code=1 (640x480) */ - nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ - nut_append_vu(&pkt, 8); /*! field_count */ - nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ - nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_nul */ - nut_append_vu(&pkt, 0); /*! 2: fields.stream */ + nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ + nut_append_vu(&pkt, 6); /*! field_count */ + nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ + nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_nul */ + nut_append_vu(&pkt, 0); /*! 2: fields.stream */ nut_append_vu(&pkt, APP_FRAME_SIZE(640_480) % /*! 3: fields.size_lsb */ APP_FRAME_SIZE_MSB_MUL); - nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ - nut_append_vu(&pkt, 1); /*! 5: fields.count */ - nut_append_vs(&pkt, NUT_UNKNOWN_MATCH_TIME); /*! 6: fields.match */ - nut_append_vu(&pkt, 1); /*! 7: fields.elision_header */ + nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ + nut_append_vu(&pkt, 1); /*! 5: fields.count */ /* frame_code=2 (720x480) */ - nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ - nut_append_vu(&pkt, 8); /*! field_count */ - nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ - nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_mul */ - nut_append_vu(&pkt, 0); /*! 2: fields.stream */ + nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ + nut_append_vu(&pkt, 6); /*! field_count */ + nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ + nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_mul */ + nut_append_vu(&pkt, 0); /*! 2: fields.stream */ nut_append_vu(&pkt, APP_FRAME_SIZE(720_480) % /*! 3: fields.size_lsb */ APP_FRAME_SIZE_MSB_MUL); - nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ - nut_append_vu(&pkt, 1); /*! 5: fields.count */ - nut_append_vs(&pkt, NUT_UNKNOWN_MATCH_TIME); /*! 6: fields.match */ - nut_append_vu(&pkt, 2); /*! 7: fields.elision_header */ + nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ + nut_append_vu(&pkt, 1); /*! 5: fields.count */ /* frame_code=3 (720x576) */ - nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ - nut_append_vu(&pkt, 8); /*! field_count */ - nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ - nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_nul */ - nut_append_vu(&pkt, 0); /*! 2: fields.stream */ - nut_append_vu(&pkt, APP_FRAME_SIZE(720_576) % /*! 3: fields.size_lsb */ + nut_append_vu(&pkt, APP_COMMON_FLAGS); /*! flags */ + nut_append_vu(&pkt, 6); /*! field_count */ + nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ + nut_append_vu(&pkt, APP_FRAME_SIZE_MSB_MUL); /*! 1: fields.size_msb_nul */ + nut_append_vu(&pkt, 0); /*! 2: fields.stream */ + nut_append_vu(&pkt, APP_FRAME_SIZE(720_576) % /*! 3: fields.size_lsb */ APP_FRAME_SIZE_MSB_MUL); - nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ - nut_append_vu(&pkt, 1); /*! 5: fields.count */ - nut_append_vs(&pkt, NUT_UNKNOWN_MATCH_TIME); /*! 6: fields.match */ - nut_append_vu(&pkt, 2); /*! 7: fields.elision_header */ + nut_append_vu(&pkt, 0); /*! 4: fields.reserved */ + nut_append_vu(&pkt, 1); /*! 5: fields.count */ /* frame_code=4-255 (invalid) */ - nut_append_vu(&pkt, NUT_FRAMEFLAG_INVALID); /*! flags */ - nut_append_vu(&pkt, 2); /*! field_count */ - nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ - nut_append_vu(&pkt, 256-4-1); /*! 1: fields.size_msb_nul */ + nut_append_vu(&pkt, NUT_FRAMEFLAG_INVALID); /*! flags */ + nut_append_vu(&pkt, 2); /*! field_count */ + nut_append_vu(&pkt, BOGUS); /*! 0: fields.pts */ + nut_append_vu(&pkt, 256-4-1); /*! 1: fields.size_msb_nul */ /* tail *******************************************/ - nut_append_vu(&pkt, 0); /*! header_count_minus_1 */ - nut_append_vu(&pkt, 0); /*! main_flags */ + nut_append_vu(&pkt, 0); /*! header_count_minus_1 */ + nut_append_vu(&pkt, 0); /*! main_flags */ nut_append_packet(&out, nut_startcode_main, pkt.dat, pkt.len); #undef BOGUS @@ -348,20 +342,20 @@ bool app_write_intro(int fd, struct app_state *state, uint64_t time_ns) { #define BOGUS 1 pkt.len = 0; - nut_append_vu(&pkt, 0); /*! stream_id */ - nut_append_vu(&pkt, NUT_STREAMCLASS_VIDEO); /*! stream_class */ - nut_append_vb(&pkt, "BGR\x08", 4); /*! fourcc */ - nut_append_vu(&pkt, 0); /*! time_base_id */ - nut_append_vu(&pkt, BOGUS); /*! msb_pts_shift (only relevant if FRAMEFLAG_CODED_PTS) */ - nut_append_vu(&pkt, BOGUS); /*! max_pts_distance (all frames have a checksum) */ - nut_append_vu(&pkt, 0); /*! decode_delay */ - nut_append_vu(&pkt, 0); /*! stream_flags */ - nut_append_vb(&pkt, NULL, 0); /*! codec_specific_data */ - nut_append_vu(&pkt, BOGUS); /*! width (all frames set width) */ - nut_append_vu(&pkt, BOGUS); /*! height (all frames set height) */ - nut_append_vu(&pkt, 1); /*! sample_width */ - nut_append_vu(&pkt, 2); /*! sample_height */ - nut_append_vu(&pkt, NUT_COLORSPACE_UNKNOWN); /*! colorspace_type */ + nut_append_vu(&pkt, 0); /*! stream_id */ + nut_append_vu(&pkt, NUT_STREAMCLASS_VIDEO); /*! stream_class */ + nut_append_vb(&pkt, "BGR\x08", 4); /*! fourcc */ + nut_append_vu(&pkt, 0); /*! time_base_id */ + nut_append_vu(&pkt, BOGUS); /*! msb_pts_shift (only relevant if FRAMEFLAG_CODED_PTS) */ + nut_append_vu(&pkt, BOGUS); /*! max_pts_distance (all frames have a checksum) */ + nut_append_vu(&pkt, 0); /*! decode_delay */ + nut_append_vu(&pkt, 0); /*! stream_flags */ + nut_append_vb(&pkt, NULL, 0); /*! codec_specific_data */ + nut_append_vu(&pkt, BOGUS); /*! width (all frames set width) */ + nut_append_vu(&pkt, BOGUS); /*! height (all frames set height) */ + nut_append_vu(&pkt, 1); /*! sample_width */ + nut_append_vu(&pkt, 2); /*! sample_height */ + nut_append_vu(&pkt, NUT_COLORSPACE_UNKNOWN); /*! colorspace_type */ nut_append_packet(&out, nut_startcode_stream, pkt.dat, pkt.len); #undef BOGUS @@ -403,8 +397,6 @@ bool app_write_frame(int fd, struct app_state *state, uint64_t time_ns, enum app nut_append_vu(&out, frame_size/APP_FRAME_SIZE_MSB_MUL); /*! data_size_msb (1 byte) */ nut_append_u32(&out, nut_crc32(&out.dat[frame_beg], out.len - frame_beg)); /*! checksum (4 bytes) */ - assert(out.len <= APP_FRAME_MAX_OVERHEAD); - /* side/meta data ( 1+(6+2)+(7+2)+1 = 19 bytes) */ uint64_t data_beg = out.len; nut_append_vu(&out, 2); /*! side_data_count (1 byte) */ @@ -416,6 +408,7 @@ bool app_write_frame(int fd, struct app_state *state, uint64_t time_ns, enum app assert(out.len - data_beg == APP_SM_SIZE); /* flush */ + assert(out.len <= APP_FRAME_MAX_OVERHEAD); bool err = xwrite(fd, out.dat, out.len); free(out.dat); free(pkt.dat); |