X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fyop.c;h=ea3175e33b07c14c13620b065da28e7a0810a87a;hb=e73d26bbd65f1ac5fc73ef3fd24cab1bed8ba2e2;hp=6c450c7cf708e24f4fffb01c2aad47ea526ff9ee;hpb=a2704c9712ad35cc22e7e0d8a79b581c07fa383b;p=ffmpeg diff --git a/libavformat/yop.c b/libavformat/yop.c index 6c450c7cf70..ea3175e33b0 100644 --- a/libavformat/yop.c +++ b/libavformat/yop.c @@ -1,30 +1,31 @@ -/** - * @file +/* * Psygnosis YOP demuxer * * Copyright (C) 2010 Mohamed Naufal Basheer * derived from the code by * Copyright (C) 2009 Thomas P. Higdon * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" typedef struct yop_dec_context { AVPacket video_packet; @@ -47,7 +48,7 @@ static int yop_probe(AVProbeData *probe_packet) return 0; } -static int yop_read_header(AVFormatContext *s, AVFormatParameters *ap) +static int yop_read_header(AVFormatContext *s) { YopDecContext *yop = s->priv_data; AVIOContext *pb = s->pb; @@ -57,31 +58,31 @@ static int yop_read_header(AVFormatContext *s, AVFormatParameters *ap) int frame_rate, ret; - audio_stream = av_new_stream(s, 0); - video_stream = av_new_stream(s, 1); + audio_stream = avformat_new_stream(s, NULL); + video_stream = avformat_new_stream(s, NULL); // Extra data that will be passed to the decoder - video_stream->codec->extradata_size = 8; - video_stream->codec->extradata = av_mallocz(video_stream->codec->extradata_size + - FF_INPUT_BUFFER_PADDING_SIZE); + video_stream->codec->extradata = av_mallocz(8 + FF_INPUT_BUFFER_PADDING_SIZE); if (!video_stream->codec->extradata) return AVERROR(ENOMEM); + video_stream->codec->extradata_size = 8; // Audio audio_dec = audio_stream->codec; audio_dec->codec_type = AVMEDIA_TYPE_AUDIO; - audio_dec->codec_id = CODEC_ID_ADPCM_IMA_WS; + audio_dec->codec_id = AV_CODEC_ID_ADPCM_IMA_APC; audio_dec->channels = 1; + audio_dec->channel_layout = AV_CH_LAYOUT_MONO; audio_dec->sample_rate = 22050; // Video video_dec = video_stream->codec; video_dec->codec_type = AVMEDIA_TYPE_VIDEO; - video_dec->codec_id = CODEC_ID_YOP; + video_dec->codec_id = AV_CODEC_ID_YOP; - avio_seek(pb, 6, SEEK_CUR); + avio_skip(pb, 6); frame_rate = avio_r8(pb); yop->frame_size = avio_r8(pb) * 2048; @@ -106,7 +107,7 @@ static int yop_read_header(AVFormatContext *s, AVFormatParameters *ap) avio_seek(pb, 2048, SEEK_SET); - av_set_pts_info(video_stream, 32, 1, frame_rate); + avpriv_set_pts_info(video_stream, 32, 1, frame_rate); return 0; } @@ -125,6 +126,12 @@ static int yop_read_packet(AVFormatContext *s, AVPacket *pkt) if (yop->video_packet.data) { *pkt = yop->video_packet; yop->video_packet.data = NULL; + yop->video_packet.buf = NULL; +#if FF_API_DESTRUCT_PACKET +FF_DISABLE_DEPRECATION_WARNINGS + yop->video_packet.destruct = NULL; +FF_ENABLE_DEPRECATION_WARNINGS +#endif yop->video_packet.size = 0; pkt->data[0] = yop->odd_frame; pkt->flags |= AV_PKT_FLAG_KEY; @@ -153,7 +160,7 @@ static int yop_read_packet(AVFormatContext *s, AVPacket *pkt) // Set position to the start of the frame pkt->pos = yop->video_packet.pos; - avio_seek(pb, yop->audio_block_length - ret, SEEK_CUR); + avio_skip(pb, yop->audio_block_length - ret); ret = avio_read(pb, yop->video_packet.data + yop->palette_size, actual_video_data_size); @@ -184,33 +191,35 @@ static int yop_read_seek(AVFormatContext *s, int stream_index, int64_t frame_pos, pos_min, pos_max; int frame_count; - av_free_packet(&yop->video_packet); - if (!stream_index) return -1; pos_min = s->data_offset; - pos_max = url_fsize(s->pb) - yop->frame_size; + pos_max = avio_size(s->pb) - yop->frame_size; frame_count = (pos_max - pos_min) / yop->frame_size; timestamp = FFMAX(0, FFMIN(frame_count, timestamp)); frame_pos = timestamp * yop->frame_size + pos_min; + + if (avio_seek(s->pb, frame_pos, SEEK_SET) < 0) + return -1; + + av_free_packet(&yop->video_packet); yop->odd_frame = timestamp & 1; - avio_seek(s->pb, frame_pos, SEEK_SET); return 0; } AVInputFormat ff_yop_demuxer = { - "yop", - NULL_IF_CONFIG_SMALL("Psygnosis YOP Format"), - sizeof(YopDecContext), - yop_probe, - yop_read_header, - yop_read_packet, - yop_read_close, - yop_read_seek, - .extensions = "yop", - .flags = AVFMT_GENERIC_INDEX, + .name = "yop", + .long_name = NULL_IF_CONFIG_SMALL("Psygnosis YOP"), + .priv_data_size = sizeof(YopDecContext), + .read_probe = yop_probe, + .read_header = yop_read_header, + .read_packet = yop_read_packet, + .read_close = yop_read_close, + .read_seek = yop_read_seek, + .extensions = "yop", + .flags = AVFMT_GENERIC_INDEX, };