Re: [FFmpeg-devel] [PATCH] libavformat/dashdec: Avoid multiple HTTP requests for initialization segment that is common among all representations

2018-04-10 Thread sanilraut
Hi Steven,

The changes mentioned have the same logic. I have re-submitted the patch.

Thanks,
Sanil

On Mon, Apr 9, 2018 at 2:52 AM, Steven Liu  wrote:

>
>
> > On 9 Apr 2018, at 15:02, sanilraut  wrote:
> >
> > Hi,
> >
> > The following patch avoid multiple HTTP requests for initialization
> segment that is common among all representations.
> >
> > ---
> > libavformat/dashdec.c | 96 ++
> ++---
> > 1 file changed, 83 insertions(+), 13 deletions(-)
> >
> > diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
> > index 8bfde4d..4d0445f 100644
> > --- a/libavformat/dashdec.c
> > +++ b/libavformat/dashdec.c
> > @@ -149,6 +149,11 @@ typedef struct DASHContext {
> > char *allowed_extensions;
> > AVDictionary *avio_opts;
> > int max_url_size;
> > +
> > +/* Flags for init section*/
> > +int is_init_section_common_video;
> > +int is_init_section_common_audio;
> > +
> > } DASHContext;
> >
> > static int ishttp(char *url)
> > @@ -416,9 +421,9 @@ static int open_url(AVFormatContext *s, AVIOContext
> **pb, const char *url,
> > if (av_strstart(proto_name, "file", NULL)) {
> > if (strcmp(c->allowed_extensions, "ALL") && !av_match_ext(url,
> c->allowed_extensions)) {
> > av_log(s, AV_LOG_ERROR,
> > -"Filename extension of \'%s\' is not a common
> multimedia extension, blocked for security reasons.\n"
> > -"If you wish to override this adjust
> allowed_extensions, you can set it to \'ALL\' to allow all\n",
> > -url);
> > +   "Filename extension of \'%s\' is not a common
> multimedia extension, blocked for security reasons.\n"
> > +   "If you wish to override this adjust
> allowed_extensions, you can set it to \'ALL\' to allow all\n",
> > +   url);
> > return AVERROR_INVALIDDATA;
> > }
> > } else if (av_strstart(proto_name, "http", NULL)) {
> > @@ -931,7 +936,7 @@ static int parse_manifest_representation(AVFormatContext
> *s, const char *url,
> > rep->last_seq_no =(int64_t) strtoll(val, NULL,
> 10) - 1;
> > xmlFree(val);
> > }
> > - }
> > +}
> > }
> >
> > fragment_timeline_node = find_child_node_by_name(
> representation_segmenttemplate_node, "SegmentTimeline");
> > @@ -1160,7 +1165,7 @@ static int parse_manifest(AVFormatContext *s,
> const char *url, AVIOContext *in)
> > } else {
> > LIBXML_TEST_VERSION
> >
> > -doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
> > +doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
> > root_element = xmlDocGetRootElement(doc);
> > node = root_element;
> >
> > @@ -1396,14 +1401,14 @@ static int refresh_manifest(AVFormatContext *s)
> >
> > if (c->n_videos != n_videos) {
> > av_log(c, AV_LOG_ERROR,
> > -"new manifest has mismatched no. of video representations,
> %d -> %d\n",
> > -n_videos, c->n_videos);
> > +   "new manifest has mismatched no. of video
> representations, %d -> %d\n",
> > +   n_videos, c->n_videos);
> > return AVERROR_INVALIDDATA;
> > }
> > if (c->n_audios != n_audios) {
> > av_log(c, AV_LOG_ERROR,
> > -"new manifest has mismatched no. of audio representations,
> %d -> %d\n",
> > -n_audios, c->n_audios);
> > +   "new manifest has mismatched no. of audio
> representations, %d -> %d\n",
> > +   n_audios, c->n_audios);
> > return AVERROR_INVALIDDATA;
> > }
> >
> > @@ -1862,6 +1867,45 @@ fail:
> > return ret;
> > }
> >
> > +static int init_section_compare_video(DASHContext *c)
> > +{
> > +int i = 0;
> > +char *url = c->videos[0]->init_section->url;
> > +int64_t url_offset = c->videos[0]->init_section->url_offset;
> > +int64_t size = c->videos[0]->init_section->size;
> > +for (i=0;in_videos;i++) {
> > +if (av_strcasecmp(c->videos[i]->init_section->url,url) ||
> c->videos[i]->init_section->url_offset != url_offset ||
> c->videos[i]->init_section->size != size) {
> > +return 0;
> > +}
> > +}
> > +return 1;
> > +}
> > +
> > +static int init_section_compare_audio(DASHContext *c)
> > +{
> > +int i = 0;
> > +char *url = c->audios[0]->init_section->url;
> > +int64_t url_offset = c->audios[0]->init_section->url_offset;
> > +int64_t size = c->audios[0]->init_section->size;
> > +for (i=0;in_audios;i++) {
> > +if (av_strcasecmp(c->audios[i]->init_section->url,url) ||
> c->audios[i]->init_section->url_offset != url_offset ||
> c->audios[i]->init_section->size != size) {
> > +return 0;
> > +}
> > +}
> > +return 1;
> > +}
> > +
> > +static void copy_init_section(struct representation *rep_dest, struct
> representation *rep_src)
> > +{

Re: [FFmpeg-devel] [PATCH] libavformat/dashdec: Avoid multiple HTTP requests for initialization segment that is common among all representations

2018-04-09 Thread Steven Liu


> On 9 Apr 2018, at 15:02, sanilraut  wrote:
> 
> Hi,
> 
> The following patch avoid multiple HTTP requests for initialization segment 
> that is common among all representations.
> 
> ---
> libavformat/dashdec.c | 96 ---
> 1 file changed, 83 insertions(+), 13 deletions(-)
> 
> diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
> index 8bfde4d..4d0445f 100644
> --- a/libavformat/dashdec.c
> +++ b/libavformat/dashdec.c
> @@ -149,6 +149,11 @@ typedef struct DASHContext {
> char *allowed_extensions;
> AVDictionary *avio_opts;
> int max_url_size;
> +
> +/* Flags for init section*/
> +int is_init_section_common_video;
> +int is_init_section_common_audio;
> +
> } DASHContext;
> 
> static int ishttp(char *url)
> @@ -416,9 +421,9 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, 
> const char *url,
> if (av_strstart(proto_name, "file", NULL)) {
> if (strcmp(c->allowed_extensions, "ALL") && !av_match_ext(url, 
> c->allowed_extensions)) {
> av_log(s, AV_LOG_ERROR,
> -"Filename extension of \'%s\' is not a common multimedia 
> extension, blocked for security reasons.\n"
> -"If you wish to override this adjust allowed_extensions, you 
> can set it to \'ALL\' to allow all\n",
> -url);
> +   "Filename extension of \'%s\' is not a common multimedia 
> extension, blocked for security reasons.\n"
> +   "If you wish to override this adjust allowed_extensions, 
> you can set it to \'ALL\' to allow all\n",
> +   url);
> return AVERROR_INVALIDDATA;
> }
> } else if (av_strstart(proto_name, "http", NULL)) {
> @@ -931,7 +936,7 @@ static int parse_manifest_representation(AVFormatContext 
> *s, const char *url,
> rep->last_seq_no =(int64_t) strtoll(val, NULL, 10) - 
> 1;
> xmlFree(val);
> }
> - }
> +}
> }
> 
> fragment_timeline_node = 
> find_child_node_by_name(representation_segmenttemplate_node, 
> "SegmentTimeline");
> @@ -1160,7 +1165,7 @@ static int parse_manifest(AVFormatContext *s, const 
> char *url, AVIOContext *in)
> } else {
> LIBXML_TEST_VERSION
> 
> -doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
> +doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
> root_element = xmlDocGetRootElement(doc);
> node = root_element;
> 
> @@ -1396,14 +1401,14 @@ static int refresh_manifest(AVFormatContext *s)
> 
> if (c->n_videos != n_videos) {
> av_log(c, AV_LOG_ERROR,
> -"new manifest has mismatched no. of video representations, %d -> 
> %d\n",
> -n_videos, c->n_videos);
> +   "new manifest has mismatched no. of video representations, %d 
> -> %d\n",
> +   n_videos, c->n_videos);
> return AVERROR_INVALIDDATA;
> }
> if (c->n_audios != n_audios) {
> av_log(c, AV_LOG_ERROR,
> -"new manifest has mismatched no. of audio representations, %d -> 
> %d\n",
> -n_audios, c->n_audios);
> +   "new manifest has mismatched no. of audio representations, %d 
> -> %d\n",
> +   n_audios, c->n_audios);
> return AVERROR_INVALIDDATA;
> }
> 
> @@ -1862,6 +1867,45 @@ fail:
> return ret;
> }
> 
> +static int init_section_compare_video(DASHContext *c)
> +{
> +int i = 0;
> +char *url = c->videos[0]->init_section->url;
> +int64_t url_offset = c->videos[0]->init_section->url_offset;
> +int64_t size = c->videos[0]->init_section->size;
> +for (i=0;in_videos;i++) {
> +if (av_strcasecmp(c->videos[i]->init_section->url,url) || 
> c->videos[i]->init_section->url_offset != url_offset || 
> c->videos[i]->init_section->size != size) {
> +return 0;
> +}
> +}
> +return 1;
> +}
> +
> +static int init_section_compare_audio(DASHContext *c)
> +{
> +int i = 0;
> +char *url = c->audios[0]->init_section->url;
> +int64_t url_offset = c->audios[0]->init_section->url_offset;
> +int64_t size = c->audios[0]->init_section->size;
> +for (i=0;in_audios;i++) {
> +if (av_strcasecmp(c->audios[i]->init_section->url,url) || 
> c->audios[i]->init_section->url_offset != url_offset || 
> c->audios[i]->init_section->size != size) {
> +return 0;
> +}
> +}
> +return 1;
> +}
> +
> +static void copy_init_section(struct representation *rep_dest, struct 
> representation *rep_src)
> +{
> +memcpy(rep_dest->init_section, rep_src->init_section, 
> sizeof(rep_src->init_section));
> +rep_dest->init_sec_buf = av_mallocz(rep_src->init_sec_buf_size);
> +memcpy(rep_dest->init_sec_buf, rep_src->init_sec_buf, 
> rep_src->init_sec_data_len);
> +rep_dest->init_sec_buf_size = rep_src->init_sec_buf_size;
> +rep_dest->in