|
|
@ -24,6 +24,8 @@ |
|
|
|
#include "libavutil/intreadwrite.h" |
|
|
|
#include "libavutil/intreadwrite.h" |
|
|
|
#include "libavutil/intfloat.h" |
|
|
|
#include "libavutil/intfloat.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
|
|
|
|
#include "libavutil/avassert.h" |
|
|
|
|
|
|
|
#include "libavutil/avstring.h" |
|
|
|
#include "avformat.h" |
|
|
|
#include "avformat.h" |
|
|
|
#include "internal.h" |
|
|
|
#include "internal.h" |
|
|
|
#include "ffm.h" |
|
|
|
#include "ffm.h" |
|
|
@ -231,6 +233,27 @@ static int ffm_close(AVFormatContext *s) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int ffm_append_recommended_configuration(AVStream *st, char **conf) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
size_t newsize; |
|
|
|
|
|
|
|
av_assert0(conf && st); |
|
|
|
|
|
|
|
if (!*conf) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
if (!st->recommended_encoder_configuration) { |
|
|
|
|
|
|
|
st->recommended_encoder_configuration = *conf; |
|
|
|
|
|
|
|
*conf = 0; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
newsize = strlen(*conf) + strlen(st->recommended_encoder_configuration) + 2; |
|
|
|
|
|
|
|
if ((ret = av_reallocp(&st->recommended_encoder_configuration, newsize)) < 0) |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
av_strlcat(st->recommended_encoder_configuration, ",", newsize); |
|
|
|
|
|
|
|
av_strlcat(st->recommended_encoder_configuration, *conf, newsize); |
|
|
|
|
|
|
|
av_freep(conf); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int ffm2_read_header(AVFormatContext *s) |
|
|
|
static int ffm2_read_header(AVFormatContext *s) |
|
|
|
{ |
|
|
|
{ |
|
|
|
FFMContext *ffm = s->priv_data; |
|
|
|
FFMContext *ffm = s->priv_data; |
|
|
@ -367,12 +390,14 @@ static int ffm2_read_header(AVFormatContext *s) |
|
|
|
} |
|
|
|
} |
|
|
|
enc = avcodec_find_encoder(codec->codec_id); |
|
|
|
enc = avcodec_find_encoder(codec->codec_id); |
|
|
|
if (enc && enc->priv_data_size && enc->priv_class) { |
|
|
|
if (enc && enc->priv_data_size && enc->priv_class) { |
|
|
|
st->recommended_encoder_configuration = av_malloc(size + 1); |
|
|
|
buffer = av_malloc(size + 1); |
|
|
|
if (!st->recommended_encoder_configuration) { |
|
|
|
if (!buffer) { |
|
|
|
ret = AVERROR(ENOMEM); |
|
|
|
ret = AVERROR(ENOMEM); |
|
|
|
goto fail; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
} |
|
|
|
avio_get_str(pb, size, st->recommended_encoder_configuration, size + 1); |
|
|
|
avio_get_str(pb, size, buffer, size + 1); |
|
|
|
|
|
|
|
if ((ret = ffm_append_recommended_configuration(st, &buffer)) < 0) |
|
|
|
|
|
|
|
goto fail; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case MKBETAG('S', '2', 'V', 'I'): |
|
|
|
case MKBETAG('S', '2', 'V', 'I'): |
|
|
@ -387,7 +412,8 @@ static int ffm2_read_header(AVFormatContext *s) |
|
|
|
} |
|
|
|
} |
|
|
|
avio_get_str(pb, INT_MAX, buffer, size); |
|
|
|
avio_get_str(pb, INT_MAX, buffer, size); |
|
|
|
av_set_options_string(codec, buffer, "=", ","); |
|
|
|
av_set_options_string(codec, buffer, "=", ","); |
|
|
|
av_freep(&buffer); |
|
|
|
if ((ret = ffm_append_recommended_configuration(st, &buffer)) < 0) |
|
|
|
|
|
|
|
goto fail; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case MKBETAG('S', '2', 'A', 'U'): |
|
|
|
case MKBETAG('S', '2', 'A', 'U'): |
|
|
|
if (f_stau++) { |
|
|
|
if (f_stau++) { |
|
|
@ -401,7 +427,7 @@ static int ffm2_read_header(AVFormatContext *s) |
|
|
|
} |
|
|
|
} |
|
|
|
avio_get_str(pb, INT_MAX, buffer, size); |
|
|
|
avio_get_str(pb, INT_MAX, buffer, size); |
|
|
|
av_set_options_string(codec, buffer, "=", ","); |
|
|
|
av_set_options_string(codec, buffer, "=", ","); |
|
|
|
av_freep(&buffer); |
|
|
|
ffm_append_recommended_configuration(st, &buffer); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
avio_seek(pb, next, SEEK_SET); |
|
|
|
avio_seek(pb, next, SEEK_SET); |
|
|
|