static int64_t updatePacketSize(AVIOContext *pb, int64_t pos) { int64_t curpos; int size; size = avio_tell(pb) - pos; if (size % 4) { gxf_write_padding(pb, 4 - size % 4); size = avio_tell(pb) - pos; } curpos = avio_tell(pb); avio_seek(pb, pos + 6, SEEK_SET); avio_wb32(pb, size); avio_seek(pb, curpos, SEEK_SET); return curpos - pos; }
static int gxf_write_media_packet(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt) { GXFStreamContext *sc = &ctx->streams[pkt->stream_index]; int64_t pos = url_ftell(pb); int padding = 0; gxf_write_packet_header(pb, PKT_MEDIA); if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */ padding = 4 - pkt->size % 4; else if (sc->codec->codec_type == CODEC_TYPE_AUDIO) padding = GXF_AUDIO_PACKET_SIZE - pkt->size; gxf_write_media_preamble(pb, ctx, pkt, pkt->size + padding); put_buffer(pb, pkt->data, pkt->size); gxf_write_padding(pb, padding); return updatePacketSize(pb, pos); }
static int64_t updatePacketSize(ByteIOContext *pb, int64_t pos) { int64_t curpos; int size; size = url_ftell(pb) - pos; if (size % 4) { gxf_write_padding(pb, 4 - size % 4); size = url_ftell(pb) - pos; } curpos = url_ftell(pb); url_fseek(pb, pos + 6, SEEK_SET); put_be32(pb, size); url_fseek(pb, curpos, SEEK_SET); return curpos - pos; }
static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt) { GXFContext *gxf = s->priv_data; AVIOContext *pb = s->pb; AVStream *st = s->streams[pkt->stream_index]; int64_t pos = avio_tell(pb); int padding = 0; int packet_start_offset = avio_tell(pb) / 1024; gxf_write_packet_header(pb, PKT_MEDIA); if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */ padding = 4 - pkt->size % 4; else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) padding = GXF_AUDIO_PACKET_SIZE - pkt->size; gxf_write_media_preamble(s, pkt, pkt->size + padding); avio_write(pb, pkt->data, pkt->size); gxf_write_padding(pb, padding); if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (!(gxf->flt_entries_nb % 500)) { gxf->flt_entries = av_realloc(gxf->flt_entries, (gxf->flt_entries_nb + 500) * sizeof(*gxf->flt_entries)); if (!gxf->flt_entries) { av_log(s, AV_LOG_ERROR, "could not reallocate flt entries\n"); return -1; } } gxf->flt_entries[gxf->flt_entries_nb++] = packet_start_offset; gxf->nb_fields += 2; // count fields } updatePacketSize(pb, pos); gxf->packet_count++; if (gxf->packet_count == 100) { gxf_write_map_packet(s, 0); gxf->packet_count = 0; } avio_flush(pb); return 0; }