X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fcdxl.c;h=a2cba526ca6b1a438556f6403e74a054f57a9ce2;hb=ccb59c106a4361b9655aa094b042863d655860c4;hp=49077b4a36cb82889045210a91949aed1f5e73b2;hpb=6d10c5bfc0e998aec69d0d59397bdb6bae458c76;p=ffmpeg diff --git a/libavformat/cdxl.c b/libavformat/cdxl.c index 49077b4a36c..a2cba526ca6 100644 --- a/libavformat/cdxl.c +++ b/libavformat/cdxl.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "libavutil/parseutils.h" #include "libavutil/opt.h" @@ -43,7 +44,7 @@ static int cdxl_read_header(AVFormatContext *s) CDXLDemuxContext *cdxl = s->priv_data; int ret; - if ((ret = av_parse_video_rate(&cdxl->fps, cdxl->framerate)) < 0) { + if (cdxl->framerate && (ret = av_parse_video_rate(&cdxl->fps, cdxl->framerate)) < 0) { av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", cdxl->framerate); return ret; @@ -100,11 +101,18 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = 0; - st->codec->codec_id = CODEC_ID_PCM_S8; - st->codec->channels = cdxl->header[1] & 0x10 ? 2 : 1; + st->codec->codec_id = AV_CODEC_ID_PCM_S8; + if (cdxl->header[1] & 0x10) { + st->codec->channels = 2; + st->codec->channel_layout = AV_CH_LAYOUT_STEREO; + } else { + st->codec->channels = 1; + st->codec->channel_layout = AV_CH_LAYOUT_MONO; + } st->codec->sample_rate = cdxl->sample_rate; + st->start_time = 0; cdxl->audio_stream_index = st->index; - avpriv_set_pts_info(st, 32, 1, cdxl->sample_rate); + avpriv_set_pts_info(st, 64, 1, cdxl->sample_rate); } ret = av_get_packet(pb, pkt, audio_size); @@ -122,11 +130,15 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_tag = 0; - st->codec->codec_id = CODEC_ID_CDXL; + st->codec->codec_id = AV_CODEC_ID_CDXL; st->codec->width = width; st->codec->height = height; + st->start_time = 0; cdxl->video_stream_index = st->index; - avpriv_set_pts_info(st, 63, cdxl->fps.den, cdxl->fps.num); + if (cdxl->framerate) + avpriv_set_pts_info(st, 64, cdxl->fps.den, cdxl->fps.num); + else + avpriv_set_pts_info(st, 64, 1, cdxl->sample_rate); } if (av_new_packet(pkt, video_size + CDXL_HEADER_SIZE) < 0) @@ -137,9 +149,11 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) av_free_packet(pkt); return ret; } + av_shrink_packet(pkt, CDXL_HEADER_SIZE + ret); pkt->stream_index = cdxl->video_stream_index; pkt->flags |= AV_PKT_FLAG_KEY; pkt->pos = pos; + pkt->duration = cdxl->framerate ? 1 : audio_size ? audio_size : 220; cdxl->read_chunk = audio_size; } @@ -150,8 +164,8 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) #define OFFSET(x) offsetof(CDXLDemuxContext, x) static const AVOption cdxl_options[] = { - { "sample_rate", "", OFFSET(sample_rate), AV_OPT_TYPE_INT, { .dbl = 11025 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, - { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, { .str = "10" }, 0, 0, AV_OPT_FLAG_DECODING_PARAM }, + { "sample_rate", "", OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 11025 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, + { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_DECODING_PARAM }, { NULL }, }; @@ -164,7 +178,7 @@ static const AVClass cdxl_demuxer_class = { AVInputFormat ff_cdxl_demuxer = { .name = "cdxl", - .long_name = NULL_IF_CONFIG_SMALL("Commodore CDXL video format"), + .long_name = NULL_IF_CONFIG_SMALL("Commodore CDXL video"), .priv_data_size = sizeof(CDXLDemuxContext), .read_header = cdxl_read_header, .read_packet = cdxl_read_packet,