mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-09 14:14:39 +02:00
avformat/movenc: use AVProducerReferenceTime side data to write the prft atom
If not available, set flags to 24 (bits 4 and 5), to signal the wallclock value is read at the time of writing the atom. Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
4e4ac20340
commit
7abc0979e6
@ -4630,6 +4630,7 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks)
|
|||||||
{
|
{
|
||||||
int64_t pos = avio_tell(pb), pts_us, ntp_ts;
|
int64_t pos = avio_tell(pb), pts_us, ntp_ts;
|
||||||
MOVTrack *first_track;
|
MOVTrack *first_track;
|
||||||
|
int flags = 24;
|
||||||
|
|
||||||
/* PRFT should be associated with at most one track. So, choosing only the
|
/* PRFT should be associated with at most one track. So, choosing only the
|
||||||
* first track. */
|
* first track. */
|
||||||
@ -4648,7 +4649,11 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mov->write_prft == MOV_PRFT_SRC_WALLCLOCK) {
|
if (mov->write_prft == MOV_PRFT_SRC_WALLCLOCK) {
|
||||||
ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(av_gettime()));
|
if (first_track->cluster[0].prft.wallclock) {
|
||||||
|
ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(first_track->cluster[0].prft.wallclock));
|
||||||
|
flags = first_track->cluster[0].prft.flags;
|
||||||
|
} else
|
||||||
|
ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(av_gettime()));
|
||||||
} else if (mov->write_prft == MOV_PRFT_SRC_PTS) {
|
} else if (mov->write_prft == MOV_PRFT_SRC_PTS) {
|
||||||
pts_us = av_rescale_q(first_track->cluster[0].pts,
|
pts_us = av_rescale_q(first_track->cluster[0].pts,
|
||||||
first_track->st->time_base, AV_TIME_BASE_Q);
|
first_track->st->time_base, AV_TIME_BASE_Q);
|
||||||
@ -4662,7 +4667,7 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks)
|
|||||||
avio_wb32(pb, 0); // Size place holder
|
avio_wb32(pb, 0); // Size place holder
|
||||||
ffio_wfourcc(pb, "prft"); // Type
|
ffio_wfourcc(pb, "prft"); // Type
|
||||||
avio_w8(pb, 1); // Version
|
avio_w8(pb, 1); // Version
|
||||||
avio_wb24(pb, 0); // Flags
|
avio_wb24(pb, flags); // Flags
|
||||||
avio_wb32(pb, first_track->track_id); // reference track ID
|
avio_wb32(pb, first_track->track_id); // reference track ID
|
||||||
avio_wb64(pb, ntp_ts); // NTP time stamp
|
avio_wb64(pb, ntp_ts); // NTP time stamp
|
||||||
avio_wb64(pb, first_track->cluster[0].pts); //media time
|
avio_wb64(pb, first_track->cluster[0].pts); //media time
|
||||||
@ -5356,8 +5361,10 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
MOVTrack *trk = &mov->tracks[pkt->stream_index];
|
MOVTrack *trk = &mov->tracks[pkt->stream_index];
|
||||||
AVCodecParameters *par = trk->par;
|
AVCodecParameters *par = trk->par;
|
||||||
|
AVProducerReferenceTime *prft;
|
||||||
unsigned int samples_in_chunk = 0;
|
unsigned int samples_in_chunk = 0;
|
||||||
int size = pkt->size, ret = 0;
|
int size = pkt->size, ret = 0;
|
||||||
|
int prft_size;
|
||||||
uint8_t *reformatted_data = NULL;
|
uint8_t *reformatted_data = NULL;
|
||||||
|
|
||||||
ret = check_pkt(s, pkt);
|
ret = check_pkt(s, pkt);
|
||||||
@ -5629,6 +5636,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE;
|
trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE;
|
||||||
trk->has_disposable++;
|
trk->has_disposable++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &prft_size);
|
||||||
|
if (prft && prft_size == sizeof(AVProducerReferenceTime))
|
||||||
|
memcpy(&trk->cluster[trk->entry].prft, prft, prft_size);
|
||||||
|
else
|
||||||
|
memset(&trk->cluster[trk->entry].prft, 0, sizeof(AVProducerReferenceTime));
|
||||||
|
|
||||||
trk->entry++;
|
trk->entry++;
|
||||||
trk->sample_count += samples_in_chunk;
|
trk->sample_count += samples_in_chunk;
|
||||||
mov->mdat_size += size;
|
mov->mdat_size += size;
|
||||||
|
@ -56,6 +56,7 @@ typedef struct MOVIentry {
|
|||||||
#define MOV_PARTIAL_SYNC_SAMPLE 0x0002
|
#define MOV_PARTIAL_SYNC_SAMPLE 0x0002
|
||||||
#define MOV_DISPOSABLE_SAMPLE 0x0004
|
#define MOV_DISPOSABLE_SAMPLE 0x0004
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
AVProducerReferenceTime prft;
|
||||||
} MOVIentry;
|
} MOVIentry;
|
||||||
|
|
||||||
typedef struct HintSample {
|
typedef struct HintSample {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user