[FFmpeg-devel] [PATCH v2] avformat/dashdec: add attribute lang for audio and subtitle streams
Steven Liu
lq at chinaffmpeg.org
Sat Apr 11 04:55:08 EEST 2020
> 2020年4月8日 下午10:39,Steven Liu <lq at chinaffmpeg.org> 写道:
>
>
>
>> 2020年3月31日 下午8:20,Steven Liu <lq at chinaffmpeg.org> 写道:
>>
>> There should have language in the metadata of streams which show to user
>>
>> Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
>> ---
>> libavformat/dashdec.c | 49 +++++++++++++++++++++++++++++++++++++++----
>> 1 file changed, 45 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
>> index 271202b0a5..5ba7feb245 100644
>> --- a/libavformat/dashdec.c
>> +++ b/libavformat/dashdec.c
>> @@ -85,6 +85,7 @@ struct representation {
>>
>> enum AVMediaType type;
>> char id[20];
>> + char *lang;
>> int bandwidth;
>> AVRational framerate;
>> AVStream *assoc_stream; /* demuxer stream associated with this representation */
>> @@ -144,6 +145,9 @@ typedef struct DASHContext {
>> uint64_t period_duration;
>> uint64_t period_start;
>>
>> + /* AdaptationSet Attribute */
>> + char *adaptionset_lang;
>> +
>> int is_live;
>> AVIOInterruptCB *interrupt_callback;
>> char *allowed_extensions;
>> @@ -872,6 +876,15 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
>> ret = AVERROR(ENOMEM);
>> goto end;
>> }
>> + if (c->adaptionset_lang) {
>> + rep->lang = av_strdup(c->adaptionset_lang);
>> + if (!rep->lang) {
>> + av_log(s, AV_LOG_ERROR, "alloc language memory failure\n");
>> + av_freep(&rep);
>> + ret = AVERROR(ENOMEM);
>> + goto end;
>> + }
>> + }
>> rep->parent = s;
>> representation_segmenttemplate_node = find_child_node_by_name(representation_node, "SegmentTemplate");
>> representation_baseurl_node = find_child_node_by_name(representation_node, "BaseURL");
>> @@ -1103,6 +1116,19 @@ end:
>> return ret;
>> }
>>
>> +static int parse_manifest_adaptationset_attr(AVFormatContext *s, xmlNodePtr adaptionset_node)
>> +{
>> + DASHContext *c = s->priv_data;
>> +
>> + if (!adaptionset_node) {
>> + av_log(s, AV_LOG_WARNING, "Cannot get AdaptionSet\n");
>> + return AVERROR(EINVAL);
>> + }
>> + c->adaptionset_lang = xmlGetProp(adaptionset_node, "lang");
>> +
>> + return 0;
>> +}
>> +
>> static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
>> xmlNodePtr adaptionset_node,
>> xmlNodePtr mpd_baseurl_node,
>> @@ -1111,6 +1137,7 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
>> xmlNodePtr period_segmentlist_node)
>> {
>> int ret = 0;
>> + DASHContext *c = s->priv_data;
>> xmlNodePtr fragment_template_node = NULL;
>> xmlNodePtr content_component_node = NULL;
>> xmlNodePtr adaptionset_baseurl_node = NULL;
>> @@ -1118,6 +1145,10 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
>> xmlNodePtr adaptionset_supplementalproperty_node = NULL;
>> xmlNodePtr node = NULL;
>>
>> + ret = parse_manifest_adaptationset_attr(s, adaptionset_node);
>> + if (ret < 0)
>> + return ret;
>> +
>> node = xmlFirstElementChild(adaptionset_node);
>> while (node) {
>> if (!av_strcasecmp(node->name, (const char *)"SegmentTemplate")) {
>> @@ -1142,13 +1173,15 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
>> adaptionset_baseurl_node,
>> adaptionset_segmentlist_node,
>> adaptionset_supplementalproperty_node);
>> - if (ret < 0) {
>> - return ret;
>> - }
>> + if (ret < 0)
>> + goto err;
>> }
>> node = xmlNextElementSibling(node);
>> }
>> - return 0;
>> +
>> +err:
>> + av_freep(&c->adaptionset_lang);
>> + return ret;
>> }
>>
>> static int parse_programinformation(AVFormatContext *s, xmlNodePtr node)
>> @@ -2121,6 +2154,10 @@ static int dash_read_header(AVFormatContext *s)
>> av_dict_set_int(&rep->assoc_stream->metadata, "variant_bitrate", rep->bandwidth, 0);
>> if (rep->id[0])
>> av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0);
>> + if (rep->lang) {
>> + av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0);
>> + av_freep(&rep->lang);
>> + }
>> }
>> for (i = 0; i < c->n_subtitles; i++) {
>> rep = c->subtitles[i];
>> @@ -2128,6 +2165,10 @@ static int dash_read_header(AVFormatContext *s)
>> rep->assoc_stream = s->streams[rep->stream_index];
>> if (rep->id[0])
>> av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0);
>> + if (rep->lang) {
>> + av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0);
>> + av_freep(&rep->lang);
>> + }
>> }
>> }
>>
>> --
>> 2.25.0
>>
>
> Ping
>
>
Will push if have no objections.
Thanks
Steven Liu
More information about the ffmpeg-devel
mailing list