<br><br><div class="gmail_quote">On 25 October 2012 21:10, Michael Bradshaw <span dir="ltr"><<a href="mailto:mbradshaw@sorensonmedia.com" target="_blank">mbradshaw@sorensonmedia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Thu, Oct 25, 2012 at 2:02 PM, Michael Bradshaw <<a href="mailto:mbradshaw@sorensonmedia.com" target="_blank">mbradshaw@sorensonmedia.com</a>> wrote:<br>> I've also included<br><br>Sorry, I meant to say that should you be interested, the source video file can be found at: <a href="https://docs.google.com/uc?export=download&id=0BxWx_dIBnyRoSnMyTFNGOHR1c2c" target="_blank">https://docs.google.com/uc?export=download&id=0BxWx_dIBnyRoSnMyTFNGOHR1c2c</a><br>

<br>The source I'm using, should you also be interested, is (remove the 'extern "C"' part to compile as C):<br><br>#include <stdio.h><br><br>extern "C"<br>{<br>#include <libavcodec/avcodec.h><br>

#include <libavformat/avformat.h><br>#include <libswresample/swresample.h><br>}<br><br>int main(int argc, char** argv)<br>{<br>    AVFrame* frame;<br>    AVFormatContext* formatContext;<br>    AVStream* videoStream;<br>

    AVCodecContext* codecContext;<br>    AVPacket packet;<br>    int frameFinished;<br>    int result;<br><br>    av_register_all();<br><br>    frame = avcodec_alloc_frame();<br>    if (!frame)<br>    {<br>        printf("Error allocating the frame\n");<br>

        return 1;<br>    }<br><br>    formatContext = NULL;<br>    if (avformat_open_input(&formatContext, "C:/Users/mbradshaw/Desktop/b/c/SIMPSONS_D2-CallOfTheSimpsons.m4v", NULL, NULL) != 0)<br>    {<br>        av_free(frame);<br>

        printf("Error opening the file\n");<br>        return 1;<br>    }<br><br>    if (avformat_find_stream_info(formatContext, NULL) < 0)<br>    {<br>        av_free(frame);<br>        avformat_close_input(&formatContext);<br>

        printf("Error finding the stream info\n");<br>        return 1;<br>    }<br>    <br>    videoStream = NULL;<br>    for (unsigned int i = 0; i < formatContext->nb_streams; ++i)<br>    {<br>        if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)<br>

        {<br>            videoStream = formatContext->streams[i];<br>            break;<br>        }<br>    }<br><br>    if (videoStream == NULL)<br>    {<br>        av_free(frame);<br>        avformat_close_input(&formatContext);<br>

        printf("Could not find any video stream in the file\n");<br>        return 1;<br>    }<br><br>    codecContext = videoStream->codec;<br>    codecContext->codec = avcodec_find_decoder(codecContext->codec_id);<br>

    if (codecContext->codec == NULL)<br>    {<br>        av_free(frame);<br>        avformat_close_input(&formatContext);<br>        printf("Couldn't find a proper decoder\n");<br>        return 1;<br>

    }<br>    else if (avcodec_open2(codecContext, codecContext->codec, NULL) != 0)<br>    {<br>        av_free(frame);<br>        avformat_close_input(&formatContext);<br>        printf("Couldn't open the context with the decoder\n");<br>

        return 1;<br>    }<br><br>    av_init_packet(&packet);<br>    while (av_read_frame(formatContext, &packet) == 0)<br>    {<br>        if (packet.stream_index == videoStream->index)<br>        {<br>            printf("packet.dts = %d\n", packet.dts);<br>

            <br>            frameFinished = 0;<br>            result = avcodec_decode_video2(codecContext, frame, &frameFinished, &packet);<br><br>            if (result >= 0 && frameFinished)<br>            {<br>

                break;<br>                av_free_packet(&packet);<br>            }<br>        }<br><br>        av_free_packet(&packet);<br>    }<br>    <br>    avcodec_flush_buffers(codecContext);<br>    printf("seek result: %d\n",<br>

           av_seek_frame(formatContext, 1, -2000000000, AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY));<br><br>    while (av_read_frame(formatContext, &packet) == 0)<br>    {<br>        if (packet.stream_index == videoStream->index)<br>

        {<br>            printf("packet.dts = %d\n", packet.dts);<br>            <br>            frameFinished = 0;<br>            result = avcodec_decode_video2(codecContext, frame, &frameFinished, &packet);<br>

<br>            if (result >= 0 && frameFinished)<br>            {<br>                break;<br>                av_free_packet(&packet);<br>            }<br>        }<br><br>        av_free_packet(&packet);<br>

    }<br><br>    av_free(frame);<br>    avcodec_close(codecContext);<br>    avformat_close_input(&formatContext);<br>    return 0;<br>}
<br>_______________________________________________<br>
Libav-user mailing list<br>
<a href="mailto:Libav-user@ffmpeg.org">Libav-user@ffmpeg.org</a><br>
<a href="http://ffmpeg.org/mailman/listinfo/libav-user" target="_blank">http://ffmpeg.org/mailman/listinfo/libav-user</a><br>
<br></blockquote></div><br>
<div>I too have seen this behaviour. If the timestamp is negative the seek ignores</div><div>it and always starts at first 0/positive timestamp.</div><div>This happens regardless of whether I use -1 or 1</div><div>I cannot check audio seeking in my case since I have no audio streams.</div>
<div><br></div><div>I would be very interested to know why this is.</div><div>Steve</div>