mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/mpegenc - accept PCM_DVD streams
PCM_S16BE stream packets in MPEG-PS have a 3-byte header and are recognized as PCM_DVD by the demuxer which prevents their correct remuxing in MPEG-1/2 PS. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
8a8d0b319a
commit
f0809bc0fa
|
@ -353,7 +353,8 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
|
||||||
if (!s->is_mpeg2 &&
|
if (!s->is_mpeg2 &&
|
||||||
(st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
|
(st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
|
||||||
st->codecpar->codec_id == AV_CODEC_ID_DTS ||
|
st->codecpar->codec_id == AV_CODEC_ID_DTS ||
|
||||||
st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE))
|
st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ||
|
||||||
|
st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD))
|
||||||
av_log(ctx, AV_LOG_WARNING,
|
av_log(ctx, AV_LOG_WARNING,
|
||||||
"%s in MPEG-1 system streams is not widely supported, "
|
"%s in MPEG-1 system streams is not widely supported, "
|
||||||
"consider using the vob or the dvd muxer "
|
"consider using the vob or the dvd muxer "
|
||||||
|
@ -363,7 +364,12 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
|
||||||
stream->id = ac3_id++;
|
stream->id = ac3_id++;
|
||||||
} else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
|
} else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
|
||||||
stream->id = dts_id++;
|
stream->id = dts_id++;
|
||||||
} else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
|
} else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ||
|
||||||
|
st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
|
||||||
|
if (st->codecpar->bits_per_coded_sample != 16) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Only 16 bit LPCM streams can be muxed.\n");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
stream->id = lpcm_id++;
|
stream->id = lpcm_id++;
|
||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
|
if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
|
||||||
|
@ -1150,6 +1156,19 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
pkt_desc->pts = pts;
|
pkt_desc->pts = pts;
|
||||||
pkt_desc->dts = dts;
|
pkt_desc->dts = dts;
|
||||||
|
|
||||||
|
if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
|
||||||
|
if (size < 3) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n", size);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip first 3 bytes of packet data, which comprise PCM header
|
||||||
|
and will be written fresh by this muxer. */
|
||||||
|
buf += 3;
|
||||||
|
size -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
pkt_desc->unwritten_size =
|
pkt_desc->unwritten_size =
|
||||||
pkt_desc->size = size;
|
pkt_desc->size = size;
|
||||||
if (!stream->predecode_packet)
|
if (!stream->predecode_packet)
|
||||||
|
|
Loading…
Reference in New Issue