int ff_hls_write_file_entry(AVIOContext *out, int insert_discont,

                             int byterange_mode,

                             double duration, int round_duration,

                             int64_t size, int64_t pos, 

                             char *baseurl, 

                             char *filename, double *prog_date_time) {

    if (!out || !filename)

        return AVERROR(EINVAL);



    if (insert_discont) {

        avio_printf(out, "#EXT-X-DISCONTINUITY\n");

    }

    if (round_duration)

        avio_printf(out, "#EXTINF:%ld,\n",  lrint(duration));

    else

        avio_printf(out, "#EXTINF:%f,\n", duration);

    if (byterange_mode)

        avio_printf(out, "#EXT-X-BYTERANGE:%"PRId64"@%"PRId64"\n", size, pos);



    if (prog_date_time) {

        time_t tt, wrongsecs;

        int milli;

        struct tm *tm, tmpbuf;

        char buf0[128], buf1[128];

        tt = (int64_t)*prog_date_time;

        milli = av_clip(lrint(1000*(*prog_date_time - tt)), 0, 999);

        tm = localtime_r(&tt, &tmpbuf);

        strftime(buf0, sizeof(buf0), "%Y-%m-%dT%H:%M:%S", tm);

        if (!strftime(buf1, sizeof(buf1), "%z", tm) || buf1[1]<'0' ||buf1[1]>'2') {

            int tz_min, dst = tm->tm_isdst;

            tm = gmtime_r(&tt, &tmpbuf);

            tm->tm_isdst = dst;

            wrongsecs = mktime(tm);

            tz_min = (FFABS(wrongsecs - tt) + 30) / 60;

            snprintf(buf1, sizeof(buf1),

                     "%c%02d%02d",

                     wrongsecs <= tt ? '+' : '-',

                     tz_min / 60,

                     tz_min % 60);

        }

        avio_printf(out, "#EXT-X-PROGRAM-DATE-TIME:%s.%03d%s\n", buf0, milli, buf1);

        *prog_date_time += duration;

    }

    if (baseurl)

        avio_printf(out, "%s", baseurl);

    avio_printf(out, "%s\n", filename);



    return 0;

}
