static int write_table0_header_legacy_attrib(AVIOContext *pb) { int pad = 0; avio_wl32(pb, 0xFFFFFFFF); write_pad(pb, 12); avio_write(pb, legacy_attrib, sizeof(legacy_attrib)); pad = WTV_PAD8(sizeof(legacy_attrib)) - sizeof(legacy_attrib); write_pad(pb, pad); write_pad(pb, 32); return 48 + WTV_PAD8(sizeof(legacy_attrib)); }
static int write_packet(AVFormatContext *s, AVPacket *pkt) { AVIOContext *pb = s->pb; WtvContext *wctx = s->priv_data; /* emit sync chunk and 'timeline.table.0.entries.Event' record every 50 frames */ if (wctx->serial - (wctx->nb_sp_pairs ? wctx->sp_pairs[wctx->nb_sp_pairs - 1].serial : 0) >= 50) write_sync(s); /* emit 'table.0.entries.time' record every 500ms */ if (pkt->pts != AV_NOPTS_VALUE && pkt->pts - (wctx->nb_st_pairs ? wctx->st_pairs[wctx->nb_st_pairs - 1].value : 0) >= 5000000) add_serial_pair(&wctx->st_pairs, &wctx->nb_st_pairs, wctx->serial, pkt->pts); if (pkt->pts != AV_NOPTS_VALUE && pkt->pts > wctx->last_pts) { wctx->last_pts = pkt->pts; wctx->last_serial = wctx->serial; } // write timestamp chunk write_timestamp(s, pkt); write_chunk_header(s, &ff_data_guid, pkt->size, INDEX_BASE + pkt->stream_index); avio_write(pb, pkt->data, pkt->size); write_pad(pb, WTV_PAD8(pkt->size) - pkt->size); wctx->serial++; avio_flush(pb); return 0; }
static void finish_chunk_noindex(AVFormatContext *s) { WtvContext *wctx = s->priv_data; AVIOContext *pb = s->pb; // update the chunk_len field and pad. int64_t chunk_len = avio_tell(pb) - (wctx->last_chunk_pos + wctx->timeline_start_pos); avio_seek(pb, -(chunk_len - 16), SEEK_CUR); avio_wl32(pb, chunk_len); avio_seek(pb, chunk_len - (16 + 4), SEEK_CUR); write_pad(pb, WTV_PAD8(chunk_len) - chunk_len); wctx->serial++; }
static int write_packet(AVFormatContext *s, AVPacket *pkt) { AVIOContext *pb = s->pb; WtvContext *wctx = s->priv_data; // write timestamp chunk write_timestamp(s, pkt); write_chunk_header(s, &ff_data_guid, pkt->size, INDEX_BASE + pkt->stream_index); avio_write(pb, pkt->data, pkt->size); write_pad(pb, WTV_PAD8(pkt->size) - pkt->size); wctx->serial++; avio_flush(pb); return 0; }
static int write_root_table(AVFormatContext *s, int64_t sector_pos) { AVIOContext *pb = s->pb; WtvContext *wctx = s->priv_data; int size, pad; int i; const WTVRootEntryTable *h = wtv_root_entry_table; for (i = 0; i < sizeof(wtv_root_entry_table)/sizeof(WTVRootEntryTable); i++, h++) { WtvFile *w = &wctx->file[i]; int filename_padding = WTV_PAD8(h->header_size) - h->header_size; WTVHeaderWriteFunc *write = h->write_header; int len = 0; int64_t len_pos; ff_put_guid(pb, &ff_dir_entry_guid); len_pos = avio_tell(pb); avio_wl16(pb, 40 + h->header_size + filename_padding + 8); // maybe updated later write_pad(pb, 6); avio_wl64(pb, write ? 0 : w->length);// maybe update later avio_wl32(pb, (h->header_size + filename_padding) >> 1); write_pad(pb, 4); avio_write(pb, h->header, h->header_size); write_pad(pb, filename_padding); if (write) { len = write(pb); // update length field avio_seek(pb, len_pos, SEEK_SET); avio_wl64(pb, 40 + h->header_size + filename_padding + len); avio_wl64(pb, len |(1ULL<<62) | (1ULL<<60)); avio_seek(pb, 8 + h->header_size + filename_padding + len, SEEK_CUR); } else { avio_wl32(pb, w->first_sector); avio_wl32(pb, w->depth); } } // caculate root table size size = avio_tell(pb) - sector_pos; pad = WTV_SECTOR_SIZE- size; write_pad(pb, pad); return size; }