* cigaes/master: lavf/matroskaenc: return an error for unsupported types. lavf/concatdec: remove invalid check for AVSEEK_FLAG_BACKWARD. lavf: filter out AVSEEK_FLAG_BACKWARD in new API. lavf: call the new seek API from the old. Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -1687,6 +1687,7 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, | |||||
| * or if stream_index is -1, in AV_TIME_BASE units. | * or if stream_index is -1, in AV_TIME_BASE units. | ||||
| * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as | * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as | ||||
| * keyframes (this may not be supported by all demuxers). | * keyframes (this may not be supported by all demuxers). | ||||
| * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. | |||||
| * | * | ||||
| * @param stream_index index of the stream which is used as time base reference | * @param stream_index index of the stream which is used as time base reference | ||||
| * @param min_ts smallest acceptable timestamp | * @param min_ts smallest acceptable timestamp | ||||
| @@ -341,7 +341,7 @@ static int real_seek(AVFormatContext *avf, int stream, | |||||
| return ret; | return ret; | ||||
| ret = try_seek(avf, stream, min_ts, ts, max_ts, flags); | ret = try_seek(avf, stream, min_ts, ts, max_ts, flags); | ||||
| if (ret < 0 && !(flags & AVSEEK_FLAG_BACKWARD) && | |||||
| if (ret < 0 && | |||||
| left < cat->nb_files - 1 && | left < cat->nb_files - 1 && | ||||
| cat->files[left + 1].start_time < max_ts) { | cat->files[left + 1].start_time < max_ts) { | ||||
| if ((ret = open_file(avf, left + 1)) < 0) | if ((ret = open_file(avf, left + 1)) < 0) | ||||
| @@ -705,7 +705,7 @@ static int mkv_write_tracks(AVFormatContext *s) | |||||
| break; | break; | ||||
| default: | default: | ||||
| av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n"); | av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n"); | ||||
| break; | |||||
| return AVERROR(EINVAL); | |||||
| } | } | ||||
| ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id); | ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id); | ||||
| if (ret < 0) return ret; | if (ret < 0) return ret; | ||||
| @@ -2135,7 +2135,19 @@ static int seek_frame_internal(AVFormatContext *s, int stream_index, | |||||
| int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) | int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) | ||||
| { | { | ||||
| int ret = seek_frame_internal(s, stream_index, timestamp, flags); | |||||
| int ret; | |||||
| if (s->iformat->read_seek2 && !s->iformat->read_seek) { | |||||
| int64_t min_ts = INT64_MIN, max_ts = INT64_MAX; | |||||
| if ((flags & AVSEEK_FLAG_BACKWARD)) | |||||
| max_ts = timestamp; | |||||
| else | |||||
| min_ts = timestamp; | |||||
| return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts, | |||||
| flags & ~AVSEEK_FLAG_BACKWARD); | |||||
| } | |||||
| ret = seek_frame_internal(s, stream_index, timestamp, flags); | |||||
| if (ret >= 0) | if (ret >= 0) | ||||
| ret = avformat_queue_attached_pictures(s); | ret = avformat_queue_attached_pictures(s); | ||||
| @@ -2152,6 +2164,7 @@ int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int | |||||
| if(s->seek2any>0) | if(s->seek2any>0) | ||||
| flags |= AVSEEK_FLAG_ANY; | flags |= AVSEEK_FLAG_ANY; | ||||
| flags &= ~AVSEEK_FLAG_BACKWARD; | |||||
| if (s->iformat->read_seek2) { | if (s->iformat->read_seek2) { | ||||
| int ret; | int ret; | ||||