static int aiff_write_trailer(AVFormatContext *s) { ByteIOContext *pb = s->pb; AIFFOutputContext *aiff = s->priv_data; AVCodecContext *enc = s->streams[0]->codec; /* Chunks sizes must be even */ int64_t file_size, end_size; end_size = file_size = url_ftell(pb); if (file_size & 1) { put_byte(pb, 0); end_size++; } if (!url_is_streamed(s->pb)) { /* File length */ url_fseek(pb, aiff->form, SEEK_SET); put_be32(pb, file_size - aiff->form - 4); /* Number of sample frames */ url_fseek(pb, aiff->frames, SEEK_SET); put_be32(pb, (file_size-aiff->ssnd-12)/enc->block_align); /* Sound Data chunk size */ url_fseek(pb, aiff->ssnd, SEEK_SET); put_be32(pb, file_size - aiff->ssnd - 4); /* return to the end */ url_fseek(pb, end_size, SEEK_SET); put_flush_packet(pb); } return 0; }
static int rm_write_trailer(AVFormatContext *s) { RMMuxContext *rm = s->priv_data; int data_size, index_pos, i; ByteIOContext *pb = s->pb; if (!url_is_streamed(s->pb)) { /* end of file: finish to write header */ index_pos = url_fseek(pb, 0, SEEK_CUR); data_size = index_pos - rm->data_pos; /* FIXME: write index */ /* undocumented end header */ put_be32(pb, 0); put_be32(pb, 0); url_fseek(pb, 0, SEEK_SET); for(i=0;i<s->nb_streams;i++) rm->streams[i].total_frames = rm->streams[i].nb_frames; rv10_write_header(s, data_size, 0); } else { /* undocumented end header */ put_be32(pb, 0); put_be32(pb, 0); } put_flush_packet(pb); return 0; }
static void write_sgi_header(ByteIOContext *f, const SGIInfo *info) { int i; put_be16(f, SGI_MAGIC); put_byte(f, info->rle); put_byte(f, info->bytes_per_channel); put_be16(f, info->dimension); put_be16(f, info->xsize); put_be16(f, info->ysize); put_be16(f, info->zsize); /* The rest are constant in this implementation */ put_be32(f, 0L); /* pixmin */ put_be32(f, 255L); /* pixmax */ put_be32(f, 0L); /* dummy */ /* name */ for (i = 0; i < 80; i++) { put_byte(f, 0); } put_be32(f, 0L); /* colormap */ /* The rest of the 512 byte header is unused. */ for (i = 0; i < 404; i++) { put_byte(f, 0); } }
void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate) { uint32_t hdr_version; uint64_t tm; uint32_t ewah_start; uint32_t ewah_size = 0; int fixup = 0; put_be32(&hdr_version, INDEX_EXTENSION_VERSION); strbuf_add(sb, &hdr_version, sizeof(uint32_t)); put_be64(&tm, istate->fsmonitor_last_update); strbuf_add(sb, &tm, sizeof(uint64_t)); fixup = sb->len; strbuf_add(sb, &ewah_size, sizeof(uint32_t)); /* we'll fix this up later */ ewah_start = sb->len; ewah_serialize_strbuf(istate->fsmonitor_dirty, sb); ewah_free(istate->fsmonitor_dirty); istate->fsmonitor_dirty = NULL; /* fix up size field */ put_be32(&ewah_size, sb->len - ewah_start); memcpy(sb->buf + fixup, &ewah_size, sizeof(uint32_t)); trace_printf_key(&trace_fsmonitor, "write fsmonitor extension successful"); }
static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) { ByteIOContext *pb = &s->pb; AVCodecContext *enc = s->streams[pkt->stream_index]->codec; FLVContext *flv = s->priv_data; int size= pkt->size; int flags; // av_log(s, AV_LOG_DEBUG, "type:%d pts: %"PRId64" size:%d\n", enc->codec_type, timestamp, size); if (enc->codec_type == CODEC_TYPE_VIDEO) { put_byte(pb, 9); flags = 2; // choose h263 flags |= pkt->flags & PKT_FLAG_KEY ? 0x10 : 0x20; // add keyframe indicator } else { assert(enc->codec_type == CODEC_TYPE_AUDIO); flags = get_audio_flags(enc); assert(size); put_byte(pb, 8); } put_be24(pb,size+1); // include flags put_be24(pb,pkt->pts); put_be32(pb,flv->reserved); put_byte(pb,flags); put_buffer(pb, pkt->data, size); put_be32(pb,size+1+11); // previous tag size flv->duration = pkt->pts + pkt->duration; put_flush_packet(pb); return 0; }
static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size) { GXFStreamContext *sc = &ctx->streams[pkt->stream_index]; int64_t dts = av_rescale_rnd(pkt->dts, ctx->sample_rate, sc->codec->time_base.den, AV_ROUND_UP); put_byte(pb, sc->media_type); put_byte(pb, sc->index); put_be32(pb, dts); if (sc->codec->codec_type == CODEC_TYPE_AUDIO) { put_be16(pb, 0); put_be16(pb, size / 2); } else if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO) { int frame_type = gxf_parse_mpeg_frame(sc, pkt->data, pkt->size); if (frame_type == FF_I_TYPE) { put_byte(pb, 0x0d); sc->iframes++; } else if (frame_type == FF_B_TYPE) { put_byte(pb, 0x0f); sc->bframes++; } else { put_byte(pb, 0x0e); sc->pframes++; } put_be24(pb, size); } else if (sc->codec->codec_id == CODEC_ID_DVVIDEO) { put_byte(pb, size / 4096); put_be24(pb, 0); } else put_be32(pb, size); put_be32(pb, dts); put_byte(pb, 1); /* flags */ put_byte(pb, 0); /* reserved */ return 16; }
static void gxf_write_packet_header(ByteIOContext *pb, GXFPktType type) { put_be32(pb, 0); /* packet leader for synchro */ put_byte(pb, 1); put_byte(pb, type); /* map packet */ put_be32(pb, 0); /* size */ put_be32(pb, 0); /* reserved */ put_byte(pb, 0xE1); /* trailer 1 */ put_byte(pb, 0xE2); /* trailer 2 */ }
static int gxf_write_track_description(AVFormatContext *s, GXFStreamContext *sc, int index) { ByteIOContext *pb = s->pb; int64_t pos; int mpeg = sc->track_type == 4 || sc->track_type == 9; /* track description section */ put_byte(pb, sc->media_type + 0x80); put_byte(pb, index + 0xC0); pos = url_ftell(pb); put_be16(pb, 0); /* size */ /* media file name */ put_byte(pb, TRACK_NAME); put_byte(pb, strlen(ES_NAME_PATTERN) + 3); put_tag(pb, ES_NAME_PATTERN); put_be16(pb, sc->media_info); put_byte(pb, 0); if (!mpeg) { /* auxiliary information */ put_byte(pb, TRACK_AUX); put_byte(pb, 8); if (sc->track_type == 3) gxf_write_timecode_auxiliary(pb, sc); else put_le64(pb, 0); } /* file system version */ put_byte(pb, TRACK_VER); put_byte(pb, 4); put_be32(pb, 0); if (mpeg) gxf_write_mpeg_auxiliary(pb, s->streams[index]); /* frame rate */ put_byte(pb, TRACK_FPS); put_byte(pb, 4); put_be32(pb, sc->frame_rate_index); /* lines per frame */ put_byte(pb, TRACK_LINES); put_byte(pb, 4); put_be32(pb, sc->lines_index); /* fields per frame */ put_byte(pb, TRACK_FPF); put_byte(pb, 4); put_be32(pb, sc->fields); return updateSize(pb, pos); }
static void output_match(ByteIOContext *out, int match_sample, int match_offset, int match_len, int *entries) { put_byte(out, 2); /* sample constructor */ put_byte(out, 0); /* track reference */ put_be16(out, match_len); put_be32(out, match_sample); put_be32(out, match_offset); put_be16(out, 1); /* bytes per block */ put_be16(out, 1); /* samples per block */ (*entries)++; }
static int gxf_write_track_description(ByteIOContext *pb, GXFStreamContext *stream) { int64_t pos; /* track description section */ put_byte(pb, stream->media_type + 0x80); put_byte(pb, stream->index + 0xC0); pos = url_ftell(pb); put_be16(pb, 0); /* size */ /* media file name */ put_byte(pb, TRACK_NAME); put_byte(pb, strlen(ES_NAME_PATTERN) + 3); put_tag(pb, ES_NAME_PATTERN); put_be16(pb, stream->media_info); put_byte(pb, 0); if (stream->codec->codec_id != CODEC_ID_MPEG2VIDEO) { /* auxiliary information */ put_byte(pb, TRACK_AUX); put_byte(pb, 8); if (stream->codec->codec_id == CODEC_ID_NONE) gxf_write_timecode_auxiliary(pb, stream); else put_le64(pb, 0); } /* file system version */ put_byte(pb, TRACK_VER); put_byte(pb, 4); put_be32(pb, 0); if (stream->codec->codec_id == CODEC_ID_MPEG2VIDEO) gxf_write_mpeg_auxiliary(pb, stream); /* frame rate */ put_byte(pb, TRACK_FPS); put_byte(pb, 4); put_be32(pb, stream->frame_rate_index); /* lines per frame */ put_byte(pb, TRACK_LINES); put_byte(pb, 4); put_be32(pb, stream->lines_index); /* fields per frame */ put_byte(pb, TRACK_FPF); put_byte(pb, 4); put_be32(pb, stream->fields); return updateSize(pb, pos); }
/* AUDIO_FILE header */ static int put_au_header(ByteIOContext *pb, AVCodecContext *enc) { if(!enc->codec_tag) return -1; put_tag(pb, ".snd"); /* magic number */ put_be32(pb, 24); /* header size */ put_be32(pb, AU_UNKNOWN_SIZE); /* data size */ put_be32(pb, (uint32_t)enc->codec_tag); /* codec ID */ put_be32(pb, enc->sample_rate); put_be32(pb, (uint32_t)enc->channels); return 0; }
AM_ERR CMp4Builder::put_FileTypeBox() { PRINT_FUNCTION_NAME; AM_ENSURE_OK_(put_be32(FileTypeBox_SIZE)); //uint32 size AM_ENSURE_OK_(put_boxtype("ftyp")); AM_ENSURE_OK_(put_boxtype("mp42")); //uint32 major_brand AM_ENSURE_OK_(put_be32(0)); //uint32 minor_version AM_ENSURE_OK_(put_boxtype("mp42")); //uint32 compatible_brands[] AM_ENSURE_OK_(put_boxtype("isom")); return ME_OK; }
static int mmf_write_header(AVFormatContext *s) { MMFContext *mmf = s->priv_data; ByteIOContext *pb = s->pb; int64_t pos; int rate; rate = mmf_rate_code(s->streams[0]->codec->sample_rate); if(rate < 0) { av_log(s, AV_LOG_ERROR, "Unsupported sample rate %d\n", s->streams[0]->codec->sample_rate); return -1; } put_tag(pb, "MMMD"); put_be32(pb, 0); pos = ff_start_tag(pb, "CNTI"); put_byte(pb, 0); /* class */ put_byte(pb, 0); /* type */ put_byte(pb, 0); /* code type */ put_byte(pb, 0); /* status */ put_byte(pb, 0); /* counts */ put_tag(pb, "VN:libavcodec,"); /* metadata ("ST:songtitle,VN:version,...") */ end_tag_be(pb, pos); put_buffer(pb, "ATR\x00", 4); put_be32(pb, 0); mmf->atrpos = url_ftell(pb); put_byte(pb, 0); /* format type */ put_byte(pb, 0); /* sequence type */ put_byte(pb, (0 << 7) | (1 << 4) | rate); /* (channel << 7) | (format << 4) | rate */ put_byte(pb, 0); /* wave base bit */ put_byte(pb, 2); /* time base d */ put_byte(pb, 2); /* time base g */ put_tag(pb, "Atsq"); put_be32(pb, 16); mmf->atsqpos = url_ftell(pb); /* Will be filled on close */ put_buffer(pb, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16); mmf->awapos = ff_start_tag(pb, "Awa\x01"); av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate); put_flush_packet(pb); return 0; }
void RTMPSession::sendSetChunkSize(int32_t chunkSize) { m_jobQueue.enqueue([&, chunkSize] { int streamId = 0; std::vector<uint8_t> buff; put_byte(buff, 2); // chunk stream ID 2 put_be24(buff, 0); // ts put_be24(buff, 4); // size (4 bytes) put_byte(buff, RTMP_PT_CHUNK_SIZE); // chunk type put_buff(buff, (uint8_t*)&streamId, sizeof(int32_t)); // msg stream id is little-endian put_be32(buff, chunkSize); write(&buff[0], buff.size()); m_outChunkSize = chunkSize; }); }
static void *generate_fake_oid(const void *old, size_t *len) { static uint32_t counter = 1; /* avoid null sha1 */ unsigned char *out = xcalloc(GIT_SHA1_RAWSZ, 1); put_be32(out + GIT_SHA1_RAWSZ - 4, counter++); return out; }
int chown(fs_context& fs, const char* path, uid_t uid, gid_t gid) { if (ffsp::is_debug_path(fs, path)) return -EPERM; inode* ino; int rc = ffsp::lookup(fs, &ino, path); if (rc < 0) return rc; ino->i_uid = put_be32(uid); ino->i_gid = put_be32(gid); mark_dirty(fs, *ino); flush_inodes(fs, false); return 0; }
static void *generate_fake_sha1(const void *old, size_t *len) { static uint32_t counter = 1; /* avoid null sha1 */ unsigned char *out = xcalloc(20, 1); put_be32(out + 16, counter++); return out; }
static int gxf_write_material_data_section(AVFormatContext *s) { GXFContext *gxf = s->priv_data; ByteIOContext *pb = s->pb; int64_t pos; const char *filename = strrchr(s->filename, '/'); pos = url_ftell(pb); put_be16(pb, 0); /* size */ /* name */ if (filename) filename++; else filename = s->filename; put_byte(pb, MAT_NAME); put_byte(pb, strlen(SERVER_PATH) + strlen(filename) + 1); put_tag(pb, SERVER_PATH); put_tag(pb, filename); put_byte(pb, 0); /* first field */ put_byte(pb, MAT_FIRST_FIELD); put_byte(pb, 4); put_be32(pb, 0); /* last field */ put_byte(pb, MAT_LAST_FIELD); put_byte(pb, 4); put_be32(pb, gxf->nb_fields); /* reserved */ put_byte(pb, MAT_MARK_IN); put_byte(pb, 4); put_be32(pb, 0); put_byte(pb, MAT_MARK_OUT); put_byte(pb, 4); put_be32(pb, gxf->nb_fields); /* estimated size */ put_byte(pb, MAT_SIZE); put_byte(pb, 4); put_be32(pb, url_fsize(pb) / 1024); return updateSize(pb, pos); }
static void ogg_update_checksum(AVFormatContext *s, int64_t crc_offset) { int64_t pos = url_ftell(s->pb); uint32_t checksum = get_checksum(s->pb); url_fseek(s->pb, crc_offset, SEEK_SET); put_be32(s->pb, checksum); url_fseek(s->pb, pos, SEEK_SET); }
AM_ERR CMp4Builder::UpdateIdxBox() { PRINT_FUNCTION_NAME; mpMuxedFile->SeekData(_mdat_begin_pos, SEEK_SET); mCurPos = _mdat_begin_pos; put_be32(_mdat_end_pos - _mdat_begin_pos); return ME_OK; }
static int gxf_write_media_preamble(AVFormatContext *s, AVPacket *pkt, int size) { GXFContext *gxf = s->priv_data; ByteIOContext *pb = s->pb; AVStream *st = s->streams[pkt->stream_index]; GXFStreamContext *sc = st->priv_data; unsigned field_nb; /* If the video is frame-encoded, the frame numbers shall be represented by * even field numbers. * see SMPTE360M-2004 6.4.2.1.3 Media field number */ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { field_nb = gxf->nb_fields; } else { field_nb = av_rescale_rnd(pkt->dts, gxf->time_base.den, (int64_t)48000*gxf->time_base.num, AV_ROUND_UP); } put_byte(pb, sc->media_type); put_byte(pb, st->index); put_be32(pb, field_nb); if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { put_be16(pb, 0); put_be16(pb, size / 2); } else if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) { int frame_type = gxf_parse_mpeg_frame(sc, pkt->data, pkt->size); if (frame_type == FF_I_TYPE) { put_byte(pb, 0x0d); sc->iframes++; } else if (frame_type == FF_B_TYPE) { put_byte(pb, 0x0f); sc->bframes++; } else { put_byte(pb, 0x0e); sc->pframes++; } put_be24(pb, size); } else if (st->codec->codec_id == CODEC_ID_DVVIDEO) { put_byte(pb, size / 4096); put_be24(pb, 0); } else put_be32(pb, size); put_be32(pb, field_nb); put_byte(pb, 1); /* flags */ put_byte(pb, 0); /* reserved */ return 16; }
static int gxf_write_material_data_section(ByteIOContext *pb, GXFContext *ctx) { offset_t pos; const char *filename = strrchr(ctx->fc->filename, '/'); pos = url_ftell(pb); put_be16(pb, 0); /* size */ /* name */ if (filename) filename++; else filename = ctx->fc->filename; put_byte(pb, MAT_NAME); put_byte(pb, strlen(SERVER_PATH) + strlen(filename) + 1); put_tag(pb, SERVER_PATH); put_tag(pb, filename); put_byte(pb, 0); /* first field */ put_byte(pb, MAT_FIRST_FIELD); put_byte(pb, 4); put_be32(pb, 0); /* last field */ put_byte(pb, MAT_LAST_FIELD); put_byte(pb, 4); put_be32(pb, ctx->nb_frames); /* reserved */ put_byte(pb, MAT_MARK_IN); put_byte(pb, 4); put_be32(pb, 0); put_byte(pb, MAT_MARK_OUT); put_byte(pb, 4); put_be32(pb, ctx->nb_frames); /* estimated size */ put_byte(pb, MAT_SIZE); put_byte(pb, 4); put_be32(pb, url_fsize(pb) / 1024); return updateSize(pb, pos); }
static int gxf_write_umf_media_dv(ByteIOContext *pb, GXFStreamContext *sc) { int i; for (i = 0; i < 8; i++) { put_be32(pb, 0); } return 32; }
/* Copy of end_tag() from avienc.c, but for big-endian chunk size */ static void end_tag_be(ByteIOContext *pb, int64_t start) { int64_t pos; pos = url_ftell(pb); url_fseek(pb, start - 4, SEEK_SET); put_be32(pb, (uint32_t)(pos - start)); url_fseek(pb, pos, SEEK_SET); }
static int rm_write_video(AVFormatContext *s, const uint8_t *buf, int size, int flags) { RMMuxContext *rm = s->priv_data; ByteIOContext *pb = s->pb; StreamInfo *stream = rm->video_stream; int key_frame = !!(flags & AV_PKT_FLAG_KEY); /* XXX: this is incorrect: should be a parameter */ /* Well, I spent some time finding the meaning of these bits. I am not sure I understood everything, but it works !! */ #if 1 write_packet_header(s, stream, size + 7 + (size >= 0x4000)*4, key_frame); /* bit 7: '1' if final packet of a frame converted in several packets */ put_byte(pb, 0x81); /* bit 7: '1' if I frame. bits 6..0 : sequence number in current frame starting from 1 */ if (key_frame) { put_byte(pb, 0x81); } else { put_byte(pb, 0x01); } if(size >= 0x4000){ put_be32(pb, size); /* total frame size */ put_be32(pb, size); /* offset from the start or the end */ }else{ put_be16(pb, 0x4000 | size); /* total frame size */ put_be16(pb, 0x4000 | size); /* offset from the start or the end */ } #else /* full frame */ write_packet_header(s, size + 6); put_byte(pb, 0xc0); put_be16(pb, 0x4000 + size); /* total frame size */ put_be16(pb, 0x4000 + packet_number * 126); /* position in stream */ #endif put_byte(pb, stream->nb_frames & 0xff); put_buffer(pb, buf, size); put_flush_packet(pb); stream->nb_frames++; return 0; }
static int sox_write_header(AVFormatContext *s) { SoXContext *sox = s->priv_data; ByteIOContext *pb = s->pb; AVCodecContext *enc = s->streams[0]->codec; AVMetadataTag *comment; size_t comment_len = 0, comment_size; comment = av_metadata_get(s->metadata, "comment", NULL, 0); if (comment) comment_len = strlen(comment->value); comment_size = (comment_len + 7) & ~7; sox->header_size = SOX_FIXED_HDR + comment_size; if (enc->codec_id == CODEC_ID_PCM_S32LE) { put_tag(pb, ".SoX"); put_le32(pb, sox->header_size); put_le64(pb, 0); /* number of samples */ put_le64(pb, av_dbl2int(enc->sample_rate)); put_le32(pb, enc->channels); put_le32(pb, comment_size); } else if (enc->codec_id == CODEC_ID_PCM_S32BE) { put_tag(pb, "XoS."); put_be32(pb, sox->header_size); put_be64(pb, 0); /* number of samples */ put_be64(pb, av_dbl2int(enc->sample_rate)); put_be32(pb, enc->channels); put_be32(pb, comment_size); } else { av_log(s, AV_LOG_ERROR, "invalid codec; use pcm_s32le or pcm_s32be\n"); return -1; } if (comment_len) put_buffer(pb, comment->value, comment_len); for ( ; comment_size > comment_len; comment_len++) put_byte(pb, 0); put_flush_packet(pb); return 0; }
//mp4 file size < 2G, no B frames, 1 chunk has only one sample AM_ERR CMp4Builder::put_MediaDataBox() { PRINT_FUNCTION_NAME; int ret = 0; _mdat_begin_pos = mCurPos; ret += put_be32(0); //uint32 size, will be revised in the end ret += put_boxtype("mdat"); return ((ret == 0) ? ME_OK : ME_ERROR); }
static int gxf_write_timecode_auxiliary(ByteIOContext *pb, GXFStreamContext *sc) { put_byte(pb, 0); /* fields */ put_byte(pb, 0); /* seconds */ put_byte(pb, 0); /* minutes */ put_byte(pb, 0); /* flags + hours */ /* reserved */ put_be32(pb, 0); return 8; }
bool update_time(timespec& dest) { const auto now = std::chrono::system_clock::now().time_since_epoch(); const auto sec = std::chrono::duration_cast<std::chrono::seconds>(now); const auto nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(now-sec); dest.sec = put_be64(sec.count()); dest.nsec = put_be32(nsec.count()); return true; }
/* send an rtp packet. sequence number is incremented, but the caller must update the timestamp itself */ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) { RTPMuxContext *s = s1->priv_data; dprintf(s1, "rtp_send_data size=%d\n", len); /* build the RTP header */ put_byte(s1->pb, (RTP_VERSION << 6)); put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7)); put_be16(s1->pb, s->seq); put_be32(s1->pb, s->timestamp); put_be32(s1->pb, s->ssrc); put_buffer(s1->pb, buf1, len); put_flush_packet(s1->pb); s->seq++; s->octet_count += len; s->packet_count++; }