|
|
@@ -2079,14 +2079,14 @@ fail: |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, |
|
|
|
uint32_t blockid, AVPacket *pkt, int keyframe) |
|
|
|
static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, |
|
|
|
uint32_t blockid, AVPacket *pkt, int keyframe) |
|
|
|
{ |
|
|
|
MatroskaMuxContext *mkv = s->priv_data; |
|
|
|
AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; |
|
|
|
mkv_track *track = &mkv->tracks[pkt->stream_index]; |
|
|
|
uint8_t *data = NULL, *side_data = NULL; |
|
|
|
int offset = 0, size = pkt->size, side_data_size = 0; |
|
|
|
int err = 0, offset = 0, size = pkt->size, side_data_size = 0; |
|
|
|
int64_t ts = track->write_dts ? pkt->dts : pkt->pts; |
|
|
|
uint64_t additional_id = 0; |
|
|
|
int64_t discard_padding = 0; |
|
|
@@ -2105,22 +2105,24 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, |
|
|
|
mkv->cluster_pos, track_number, keyframe != 0); |
|
|
|
if (par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0 && |
|
|
|
(AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) |
|
|
|
ff_avc_parse_nal_units_buf(pkt->data, &data, &size); |
|
|
|
err = ff_avc_parse_nal_units_buf(pkt->data, &data, &size); |
|
|
|
else if (par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6 && |
|
|
|
(AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) |
|
|
|
/* extradata is Annex B, assume the bitstream is too and convert it */ |
|
|
|
ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL); |
|
|
|
err = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL); |
|
|
|
else if (par->codec_id == AV_CODEC_ID_AV1) |
|
|
|
ff_av1_filter_obus_buf(pkt->data, &data, &size); |
|
|
|
err = ff_av1_filter_obus_buf(pkt->data, &data, &size); |
|
|
|
else if (par->codec_id == AV_CODEC_ID_WAVPACK) { |
|
|
|
int ret = mkv_strip_wavpack(pkt->data, &data, &size); |
|
|
|
if (ret < 0) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Error stripping a WavPack packet.\n"); |
|
|
|
return; |
|
|
|
} |
|
|
|
err = mkv_strip_wavpack(pkt->data, &data, &size); |
|
|
|
} else |
|
|
|
data = pkt->data; |
|
|
|
|
|
|
|
if (err < 0) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Error when reformatting data of " |
|
|
|
"a packet from stream %d.\n", pkt->stream_index); |
|
|
|
return err; |
|
|
|
} |
|
|
|
|
|
|
|
if (par->codec_id == AV_CODEC_ID_PRORES && size >= 8) { |
|
|
|
/* Matroska specification requires to remove the first QuickTime atom |
|
|
|
*/ |
|
|
@@ -2184,6 +2186,8 @@ static void mkv_write_block(AVFormatContext *s, AVIOContext *pb, |
|
|
|
if ((side_data_size && additional_id == 1) || discard_padding) { |
|
|
|
end_ebml_master(pb, block_group); |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt) |
|
|
@@ -2389,7 +2393,9 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_ |
|
|
|
relative_packet_pos = avio_tell(pb); |
|
|
|
|
|
|
|
if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) { |
|
|
|
mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); |
|
|
|
ret = mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) { |
|
|
|
ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1); |
|
|
|
if (ret < 0) return ret; |
|
|
|