int cur_seq_no;
int end_of_segment;
int first_packet;
+ int64_t first_timestamp;
AVIOInterruptCB *interrupt_callback;
} AppleHTTPContext;
ffurl_close(var->input);
if (var->ctx) {
var->ctx->pb = NULL;
- av_close_input_file(var->ctx);
+ avformat_close_input(&var->ctx);
}
av_free(var);
}
enum KeyType key_type = KEY_NONE;
uint8_t iv[16] = "";
int has_iv = 0;
- char key[MAX_URL_SIZE];
+ char key[MAX_URL_SIZE] = "";
char line[1024];
const char *ptr;
int close_in = 0;
v->pb.seekable = 0;
ret = av_probe_input_buffer(&v->pb, &in_fmt, v->segments[0]->url,
NULL, 0, 0);
- if (ret < 0)
+ if (ret < 0) {
+ /* Free the ctx - it isn't initialized properly at this point,
+ * so avformat_close_input shouldn't be called. If
+ * avformat_open_input fails below, it frees and zeros the
+ * context, so it doesn't need any special treatment like this. */
+ avformat_free_context(v->ctx);
+ v->ctx = NULL;
goto fail;
+ }
v->ctx->pb = &v->pb;
ret = avformat_open_input(&v->ctx, v->segments[0]->url, in_fmt, NULL);
if (ret < 0)
}
c->first_packet = 1;
+ c->first_timestamp = AV_NOPTS_VALUE;
return 0;
fail:
/* Check if any new streams are needed */
for (i = 0; i < c->n_variants; i++)
- c->variants[i]->cur_needed = 0;;
+ c->variants[i]->cur_needed = 0;
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
if (!url_feof(&var->pb))
return ret;
reset_packet(&var->pkt);
+ } else {
+ if (c->first_timestamp == AV_NOPTS_VALUE)
+ c->first_timestamp = var->pkt.dts;
}
}
/* Check if this stream has the packet with the lowest dts */
for (i = 0; i < c->n_variants; i++) {
/* Reset reading */
struct variant *var = c->variants[i];
- int64_t pos = 0;
- if (var->input) {
+ int64_t pos = c->first_timestamp == AV_NOPTS_VALUE ? 0 :
+ av_rescale_rnd(c->first_timestamp, 1, stream_index >= 0 ?
+ s->streams[stream_index]->time_base.den :
+ AV_TIME_BASE, flags & AVSEEK_FLAG_BACKWARD ?
+ AV_ROUND_DOWN : AV_ROUND_UP);
+ if (var->input) {
ffurl_close(var->input);
var->input = NULL;
}