mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
ogg/speex: set correct timestamp and duration for the first packet.
The first timestamp should be negative due to delay. Also, do not set AVCodecContext.frame_size unnecessarily.
This commit is contained in:
parent
4ee247a2bd
commit
0e69c04773
@ -31,6 +31,7 @@
|
|||||||
#include "oggdec.h"
|
#include "oggdec.h"
|
||||||
|
|
||||||
struct speex_params {
|
struct speex_params {
|
||||||
|
int packet_size;
|
||||||
int final_packet_duration;
|
int final_packet_duration;
|
||||||
int seq;
|
int seq;
|
||||||
};
|
};
|
||||||
@ -58,14 +59,10 @@ static int speex_header(AVFormatContext *s, int idx) {
|
|||||||
st->codec->sample_rate = AV_RL32(p + 36);
|
st->codec->sample_rate = AV_RL32(p + 36);
|
||||||
st->codec->channels = AV_RL32(p + 48);
|
st->codec->channels = AV_RL32(p + 48);
|
||||||
|
|
||||||
/* We treat the whole Speex packet as a single frame everywhere Speex
|
spxp->packet_size = AV_RL32(p + 56);
|
||||||
is handled in Libav. This avoids the complexities of splitting
|
frames_per_packet = AV_RL32(p + 64);
|
||||||
and joining individual Speex frames, which are not always
|
|
||||||
byte-aligned. */
|
|
||||||
st->codec->frame_size = AV_RL32(p + 56);
|
|
||||||
frames_per_packet = AV_RL32(p + 64);
|
|
||||||
if (frames_per_packet)
|
if (frames_per_packet)
|
||||||
st->codec->frame_size *= frames_per_packet;
|
spxp->packet_size *= frames_per_packet;
|
||||||
|
|
||||||
st->codec->extradata_size = os->psize;
|
st->codec->extradata_size = os->psize;
|
||||||
st->codec->extradata = av_malloc(st->codec->extradata_size
|
st->codec->extradata = av_malloc(st->codec->extradata_size
|
||||||
@ -95,7 +92,7 @@ static int speex_packet(AVFormatContext *s, int idx)
|
|||||||
struct ogg *ogg = s->priv_data;
|
struct ogg *ogg = s->priv_data;
|
||||||
struct ogg_stream *os = ogg->streams + idx;
|
struct ogg_stream *os = ogg->streams + idx;
|
||||||
struct speex_params *spxp = os->private;
|
struct speex_params *spxp = os->private;
|
||||||
int packet_size = s->streams[idx]->codec->frame_size;
|
int packet_size = spxp->packet_size;
|
||||||
|
|
||||||
if (os->flags & OGG_FLAG_EOS && os->lastpts != AV_NOPTS_VALUE &&
|
if (os->flags & OGG_FLAG_EOS && os->lastpts != AV_NOPTS_VALUE &&
|
||||||
os->granule > 0) {
|
os->granule > 0) {
|
||||||
@ -108,9 +105,10 @@ static int speex_packet(AVFormatContext *s, int idx)
|
|||||||
|
|
||||||
if (!os->lastpts && os->granule > 0)
|
if (!os->lastpts && os->granule > 0)
|
||||||
/* first packet */
|
/* first packet */
|
||||||
os->pduration = os->granule - packet_size * (ogg_page_packets(os) - 1);
|
os->lastpts = os->lastdts = os->granule - packet_size *
|
||||||
else if (os->flags & OGG_FLAG_EOS && os->segp == os->nsegs &&
|
ogg_page_packets(os);
|
||||||
spxp->final_packet_duration)
|
if (os->flags & OGG_FLAG_EOS && os->segp == os->nsegs &&
|
||||||
|
spxp->final_packet_duration)
|
||||||
/* final packet */
|
/* final packet */
|
||||||
os->pduration = spxp->final_packet_duration;
|
os->pduration = spxp->final_packet_duration;
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user