Here is my code:
void SA_seek(SAContext *sa_ctx, double delta)
{
SDL_mutexP(sa_ctx->decode_lock);
int64_t pos = (av_gettime() / 1000000.0 + delta) * AV_TIME_BASE;
int seek_flags = delta < 0 ? AVSEEK_FLAG_BACKWARD : 0;
int stream_index = sa_ctx->v_stream;
int64_t seek_target = av_rescale_q(pos, AV_TIME_BASE_Q,
sa_ctx->video_st->time_base);
if(av_seek_frame(sa_ctx->avfmt_ctx_ptr, stream_index,
seek_target, seek_flags) < 0)
fprintf(stderr, "Error while seeking!\n"); // FIXME
else
{
void *ptr;
while((ptr = SAQ_pop(sa_ctx->vq_ctx)) != NULL)
{
av_free(((SAVideoPacket *)ptr)->frame_ptr);
free(ptr);
}
while((ptr = SAQ_pop(sa_ctx->aq_ctx)) != NULL)
{
av_free(((SAAudioPacket *)ptr)->abuffer);
free(ptr);
}
avcodec_flush_buffers(sa_ctx->a_codec_ctx);
avcodec_flush_buffers(sa_ctx->v_codec_ctx);
}
SDL_mutexV(sa_ctx->decode_lock);
}
and this, in main():
while(SDL_PollEvent(&event))
if(event.type == SDL_KEYDOWN)
{
double delta;
switch(event.key.keysym.sym)
{
case SDLK_LEFT:
delta = -10.0;
break;
case SDLK_RIGHT:
delta = 10.0;
break;
case SDLK_UP:
delta = -60.0;
break;
case SDLK_DOWN:
delta = 60.0;
break;
default:
goto IGNORE_KEY;
}
SA_seek(sa_ctx, delta);
SDL_PauseAudio(0);
IGNORE_KEY:;
}
After calling SA_seek(), my program will call av_read_frame() to get a
new AVPacket for decoding.
but it just refuses to work, returning a valus less than zero. :-P
wecing.
_______________________________________________
libav-api mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-api