summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/cafenc.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/libavformat/cafenc.c b/libavformat/cafenc.c
index 422beaf93d..816e978945 100644
--- a/libavformat/cafenc.c
+++ b/libavformat/cafenc.c
@@ -26,6 +26,8 @@
#include "libavutil/intfloat.h"
#include "libavutil/dict.h"
+#define FRAME_SIZE_OFFSET 40
+
typedef struct {
int64_t data;
uint8_t *pkt_sizes;
@@ -81,8 +83,6 @@ static uint32_t samples_per_packet(enum AVCodecID codec_id, int channels, int bl
return 320;
case AV_CODEC_ID_MP1:
return 384;
- case AV_CODEC_ID_OPUS:
- return 960;
case AV_CODEC_ID_MP2:
case AV_CODEC_ID_MP3:
return 1152;
@@ -240,19 +240,26 @@ static int caf_write_trailer(AVFormatContext *s)
{
CAFContext *caf = s->priv_data;
AVIOContext *pb = s->pb;
- AVCodecParameters *par = s->streams[0]->codecpar;
+ AVStream *st = s->streams[0];
+ AVCodecParameters *par = st->codecpar;
if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
int64_t file_size = avio_tell(pb);
avio_seek(pb, caf->data, SEEK_SET);
avio_wb64(pb, file_size - caf->data - 8);
- avio_seek(pb, file_size, SEEK_SET);
if (!par->block_align) {
+ int packet_size = samples_per_packet(par->codec_id, par->channels, par->block_align);
+ if (!packet_size) {
+ packet_size = st->duration / (caf->packets - 1);
+ avio_seek(pb, FRAME_SIZE_OFFSET, SEEK_SET);
+ avio_wb32(pb, packet_size);
+ }
+ avio_seek(pb, file_size, SEEK_SET);
ffio_wfourcc(pb, "pakt");
avio_wb64(pb, caf->size_entries_used + 24);
avio_wb64(pb, caf->packets); ///< mNumberPackets
- avio_wb64(pb, caf->packets * samples_per_packet(par->codec_id, par->channels, par->block_align)); ///< mNumberValidFrames
+ avio_wb64(pb, caf->packets * packet_size); ///< mNumberValidFrames
avio_wb32(pb, 0); ///< mPrimingFrames
avio_wb32(pb, 0); ///< mRemainderFrames
avio_write(pb, caf->pkt_sizes, caf->size_entries_used);