Re: [FFmpeg-devel] [PATCH v5 3/3] avformat/hlsenc:addition of CODECS attribute in the master playlist

2017-11-30 Thread Dixit, Vishwanath


>On 11/30/17, 5:31 PM, "Steven Liu"  wrote:
>
>2017-11-30 19:32 GMT+08:00  :
>>   From: Vishwanath Dixit 
>>
>>---
>>  libavformat/Makefile  |  2 +-
>>  libavformat/dashenc.c |  2 +-
>>  libavformat/hlsenc.c  | 65 
>> +--
>>  libavformat/hlsplaylist.c |  5 +++-
>>  libavformat/hlsplaylist.h |  3 ++-
>>  libavformat/reverse.c |  1 +
>Remove this modify if this have nothing to do.
This new wrapper file is needed, as the patch is using the function ff_reverse, 
which is defined in libavutil/reverse.c. Without this libavformat library 
compilation will fail with the same error as reported for libavdevice here 
https://trac.ffmpeg.org/ticket/6544.

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v5 3/3] avformat/hlsenc:addition of CODECS attribute in the master playlist

2017-11-30 Thread Steven Liu
2017-11-30 19:32 GMT+08:00  :
> From: Vishwanath Dixit 
>
> ---
>  libavformat/Makefile  |  2 +-
>  libavformat/dashenc.c |  2 +-
>  libavformat/hlsenc.c  | 65 
> +--
>  libavformat/hlsplaylist.c |  5 +++-
>  libavformat/hlsplaylist.h |  3 ++-
>  libavformat/reverse.c |  1 +
Remove this modify if this have nothing to do.

>  tests/ref/fate/source |  1 +
>  7 files changed, 73 insertions(+), 6 deletions(-)
>  create mode 100644 libavformat/reverse.c
>
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 4bffdf2..2bdb777 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -61,7 +61,7 @@ OBJS-$(CONFIG_RTPDEC)+= rdt.o   
> \
>  rtpdec_vp9.o\
>  rtpdec_xiph.o
>  OBJS-$(CONFIG_RTPENC_CHAIN)  += rtpenc_chain.o rtp.o
> -OBJS-$(CONFIG_SHARED)+= log2_tab.o golomb_tab.o
> +OBJS-$(CONFIG_SHARED)+= log2_tab.o golomb_tab.o reverse.o
>  OBJS-$(CONFIG_SRTP)  += srtp.o
>
>  # muxers/demuxers
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index 90cd2d0..e0b1679 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -754,7 +754,7 @@ static int write_manifest(AVFormatContext *s, int final)
>  AVStream *st = s->streams[i];
>  get_hls_playlist_name(playlist_file, sizeof(playlist_file), 
> NULL, i);
>  ff_hls_write_stream_info(st, out, st->codecpar->bit_rate,
> -playlist_file, NULL);
> +playlist_file, NULL, NULL);
>  }
>  avio_close(out);
>  if (use_rename)
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index 8d4b333..0702124 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -39,6 +39,7 @@
>  #include "libavutil/avstring.h"
>  #include "libavutil/intreadwrite.h"
>  #include "libavutil/random_seed.h"
> +#include "libavutil/reverse.h"
>  #include "libavutil/opt.h"
>  #include "libavutil/log.h"
>  #include "libavutil/time_internal.h"
> @@ -1074,6 +1075,63 @@ static int get_relative_url(const char *master_url, 
> const char *media_url,
>  return 0;
>  }
>
> +static char *get_codec_str(AVStream *vid_st, AVStream *aud_st) {
> +size_t codec_str_size = 64;
> +char *codec_str = av_malloc(codec_str_size);
> +int video_str_len = 0;
> +
> +if (!codec_str)
> +return NULL;
> +
> +if (!vid_st && !aud_st) {
> +goto fail;
> +}
> +
> +if (vid_st) {
> +if (vid_st->codecpar->profile != FF_PROFILE_UNKNOWN &&
> +vid_st->codecpar->level != FF_LEVEL_UNKNOWN &&
> +vid_st->codecpar->codec_id == AV_CODEC_ID_H264) {
> +snprintf(codec_str, codec_str_size, "avc1.%02x%02x%02x",
> + vid_st->codecpar->profile & 0xFF,
> + ff_reverse[(vid_st->codecpar->profile >> 8) & 0xFF],
> + vid_st->codecpar->level);
> +} else {
> +goto fail;
> +}
> +video_str_len = strlen(codec_str);
> +}
> +
> +if (aud_st) {
> +char *audio_str = codec_str;
> +if (video_str_len) {
> +codec_str[video_str_len] = ',';
> +video_str_len += 1;
> +audio_str += video_str_len;
> +codec_str_size -= video_str_len;
> +}
> +if (aud_st->codecpar->codec_id == AV_CODEC_ID_MP2) {
> +snprintf(audio_str, codec_str_size, "mp4a.40.33");
> +} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_MP3) {
> +snprintf(audio_str, codec_str_size, "mp4a.40.34");
> +} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_AAC) {
> +/* TODO : For HE-AAC, HE-AACv2, the last digit needs to be set 
> to 5 and 29 respectively */
> +snprintf(audio_str, codec_str_size, "mp4a.40.2");
> +} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_AC3) {
> +snprintf(audio_str, codec_str_size, "mp4a.A5");
> +} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_EAC3) {
> +snprintf(audio_str, codec_str_size, "mp4a.A6");
> +} else {
> +goto fail;
> +}
> +}
> +
> +return codec_str;
> +
> +fail:
> +av_free(codec_str);
> +return NULL;
> +}
> +
>  static int create_master_playlist(AVFormatContext *s,
>VariantStream * const input_vs)
>  {
> @@ -1084,7 +1142,7 @@ static int create_master_playlist(AVFormatContext *s,
>  AVDictionary *options = NULL;
>  unsigned int i, j;
>  int m3u8_name_size, ret, bandwidth;
> -char *m3u8_rel_name;
> +char *m3u8_rel_name, *codec_str;
>
>  input_vs->m3u8_created = 1;
>  if (!hls->master_m3u8_created) {
> @@ -1198,9 +1256,12 @@ static 

[FFmpeg-devel] [PATCH v5 3/3] avformat/hlsenc:addition of CODECS attribute in the master playlist

2017-11-30 Thread vdixit
From: Vishwanath Dixit 

---
 libavformat/Makefile  |  2 +-
 libavformat/dashenc.c |  2 +-
 libavformat/hlsenc.c  | 65 +--
 libavformat/hlsplaylist.c |  5 +++-
 libavformat/hlsplaylist.h |  3 ++-
 libavformat/reverse.c |  1 +
 tests/ref/fate/source |  1 +
 7 files changed, 73 insertions(+), 6 deletions(-)
 create mode 100644 libavformat/reverse.c

diff --git a/libavformat/Makefile b/libavformat/Makefile
index 4bffdf2..2bdb777 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -61,7 +61,7 @@ OBJS-$(CONFIG_RTPDEC)+= rdt.o 
  \
 rtpdec_vp9.o\
 rtpdec_xiph.o
 OBJS-$(CONFIG_RTPENC_CHAIN)  += rtpenc_chain.o rtp.o
-OBJS-$(CONFIG_SHARED)+= log2_tab.o golomb_tab.o
+OBJS-$(CONFIG_SHARED)+= log2_tab.o golomb_tab.o reverse.o
 OBJS-$(CONFIG_SRTP)  += srtp.o
 
 # muxers/demuxers
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 90cd2d0..e0b1679 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -754,7 +754,7 @@ static int write_manifest(AVFormatContext *s, int final)
 AVStream *st = s->streams[i];
 get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, 
i);
 ff_hls_write_stream_info(st, out, st->codecpar->bit_rate,
-playlist_file, NULL);
+playlist_file, NULL, NULL);
 }
 avio_close(out);
 if (use_rename)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 8d4b333..0702124 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -39,6 +39,7 @@
 #include "libavutil/avstring.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/random_seed.h"
+#include "libavutil/reverse.h"
 #include "libavutil/opt.h"
 #include "libavutil/log.h"
 #include "libavutil/time_internal.h"
@@ -1074,6 +1075,63 @@ static int get_relative_url(const char *master_url, 
const char *media_url,
 return 0;
 }
 
+static char *get_codec_str(AVStream *vid_st, AVStream *aud_st) {
+size_t codec_str_size = 64;
+char *codec_str = av_malloc(codec_str_size);
+int video_str_len = 0;
+
+if (!codec_str)
+return NULL;
+
+if (!vid_st && !aud_st) {
+goto fail;
+}
+
+if (vid_st) {
+if (vid_st->codecpar->profile != FF_PROFILE_UNKNOWN &&
+vid_st->codecpar->level != FF_LEVEL_UNKNOWN &&
+vid_st->codecpar->codec_id == AV_CODEC_ID_H264) {
+snprintf(codec_str, codec_str_size, "avc1.%02x%02x%02x",
+ vid_st->codecpar->profile & 0xFF,
+ ff_reverse[(vid_st->codecpar->profile >> 8) & 0xFF],
+ vid_st->codecpar->level);
+} else {
+goto fail;
+}
+video_str_len = strlen(codec_str);
+}
+
+if (aud_st) {
+char *audio_str = codec_str;
+if (video_str_len) {
+codec_str[video_str_len] = ',';
+video_str_len += 1;
+audio_str += video_str_len;
+codec_str_size -= video_str_len;
+}
+if (aud_st->codecpar->codec_id == AV_CODEC_ID_MP2) {
+snprintf(audio_str, codec_str_size, "mp4a.40.33");
+} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_MP3) {
+snprintf(audio_str, codec_str_size, "mp4a.40.34");
+} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_AAC) {
+/* TODO : For HE-AAC, HE-AACv2, the last digit needs to be set to 
5 and 29 respectively */
+snprintf(audio_str, codec_str_size, "mp4a.40.2");
+} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_AC3) {
+snprintf(audio_str, codec_str_size, "mp4a.A5");
+} else if (aud_st->codecpar->codec_id == AV_CODEC_ID_EAC3) {
+snprintf(audio_str, codec_str_size, "mp4a.A6");
+} else {
+goto fail;
+}
+}
+
+return codec_str;
+
+fail:
+av_free(codec_str);
+return NULL;
+}
+
 static int create_master_playlist(AVFormatContext *s,
   VariantStream * const input_vs)
 {
@@ -1084,7 +1142,7 @@ static int create_master_playlist(AVFormatContext *s,
 AVDictionary *options = NULL;
 unsigned int i, j;
 int m3u8_name_size, ret, bandwidth;
-char *m3u8_rel_name;
+char *m3u8_rel_name, *codec_str;
 
 input_vs->m3u8_created = 1;
 if (!hls->master_m3u8_created) {
@@ -1198,9 +1256,12 @@ static int create_master_playlist(AVFormatContext *s,
 bandwidth += aud_st->codecpar->bit_rate;
 bandwidth += bandwidth / 10;
 
+codec_str = get_codec_str(vid_st, aud_st);
+
 ff_hls_write_stream_info(vid_st, master_pb, bandwidth, m3u8_rel_name,
-aud_st ? vs->agroup : NULL);
+codec_str,