On Thu, Apr 14, 2011 at 01:32:46PM +0200, Luca Barbato wrote:
> onMetadata is forwarded for sure on rtmp, custom scriptdata might not.
> ---
> libavformat/flvdec.c | 35 +++++++++++++++++++++++------------
> libavformat/flvenc.c | 4 ++--
> 2 files changed, 25 insertions(+), 14 deletions(-)
>
> diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
> index 7b348cd..2b07fb3 100644
> --- a/libavformat/flvdec.c
> +++ b/libavformat/flvdec.c
> @@ -203,6 +203,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream
> *astream, AVStream *vst
> AMFDataType amf_type;
> char str_val[256];
> double num_val;
> + int ret;
>
> num_val = 0;
> ioc = s->pb;
> @@ -242,8 +243,10 @@ static int amf_parse_object(AVFormatContext *s, AVStream
> *astream, AVStream *vst
> avio_skip(ioc, 4); //skip 32-bit max array index
> while(avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc,
> str_val, sizeof(str_val)) > 0) {
> //this is the only case in which we would want a nested
> parse to not skip over the object
> - if(amf_parse_object(s, astream, vstream, str_val, max_pos,
> depth + 1) < 0)
> - return -1;
> + ret = amf_parse_object(s, astream, vstream, str_val,
> + max_pos, depth + 1);
> + if(ret)
> + return ret;
> }
> if(avio_r8(ioc) != AMF_END_OF_OBJECT)
> return -1;
> @@ -288,8 +291,11 @@ static int amf_parse_object(AVFormatContext *s, AVStream
> *astream, AVStream *vst
> st->codec->codec_id = num_val;
> av_set_pts_info(st, 32, 1, 1000);
> }
> - } else if (amf_type == AMF_DATA_TYPE_STRING)
> + } else if (amf_type == AMF_DATA_TYPE_STRING) {
> + if(!strcmp(key, "data-stream-packet"))
> + return 1;
> av_metadata_set2(&s->metadata, key, str_val, 0);
> + }
> }
>
> return 0;
> @@ -299,7 +305,8 @@ static int flv_read_metabody(AVFormatContext *s, int64_t
> next_pos) {
> AMFDataType type;
> AVStream *stream, *astream, *vstream;
> AVIOContext *ioc;
> - int i;
> + int i, ret;
> + int64_t pos;
> char buffer[12]; //only needs to hold the string "data-stream". Anything
> longer is something we don't want.
>
> astream = NULL;
> @@ -312,9 +319,6 @@ static int flv_read_metabody(AVFormatContext *s, int64_t
> next_pos) {
> amf_get_string(ioc, buffer, sizeof(buffer)) < 0)
> return -1;
>
> - if(!strcmp(buffer, "data-stream"))
> - return 1;
> -
> if(strcmp(buffer, "onMetaData"))
> return -1;
>
> @@ -325,11 +329,15 @@ static int flv_read_metabody(AVFormatContext *s,
> int64_t next_pos) {
> else if(stream->codec->codec_type == AVMEDIA_TYPE_VIDEO) vstream =
> stream;
> }
>
> - //parse the second object (we want a mixed array)
> - if(amf_parse_object(s, astream, vstream, buffer, next_pos, 0) < 0)
> - return -1;
> + pos = avio_tell(ioc);
>
> - return 0;
> + //parse the second object (we want a mixed array)
> + ret = amf_parse_object(s, astream, vstream, buffer, next_pos, 0);
> + if (ret > 0) {
> + av_log(NULL, AV_LOG_INFO, " ");
> + avio_seek(ioc, pos, SEEK_SET);
> + }
> + return ret;
> }
>
> static AVStream *create_stream(AVFormatContext *s, int is_audio){
> @@ -411,7 +419,10 @@ static int flv_data_packet(AVFormatContext *s, AVPacket
> *pkt,
> goto out;
> codec_id = av_int2dbl(avio_rb64(pb));
> amf_get_string(pb, buf, sizeof(buf));
> - if (strcmp(buf,"data") && avio_r8(pb) != AMF_DATA_TYPE_STRING)
> + if (strcmp(buf,"data-stream-packet"))
> + goto out;
> + type = avio_r8(pb);
> + if (type != AMF_DATA_TYPE_STRING)
> goto out;
> length = avio_rb16(pb);
> ret = av_get_packet(s->pb, pkt, length);
> diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
> index 51180c9..9db2d0f 100644
> --- a/libavformat/flvenc.c
> +++ b/libavformat/flvenc.c
> @@ -446,12 +446,12 @@ static int flv_write_packet(AVFormatContext *s,
> AVPacket *pkt)
> int data_size;
> int metadata_size_pos = avio_tell(pb);
> avio_w8(pb, AMF_DATA_TYPE_STRING);
> - put_amf_string(pb, "data-stream");
> + put_amf_string(pb, "onMetaData");
> avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY);
> avio_wb32(pb, 2);
> put_amf_string(pb, "codecid");
> put_amf_double(pb, enc->codec_id);
> - put_amf_string(pb, "data");
> + put_amf_string(pb, "data-stream-packet");
> avio_w8(pb, AMF_DATA_TYPE_STRING);
> put_amf_string(pb, pkt->data);
> put_amf_string(pb, "");
> --
why not fuse it into patch where this all is introduced?
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel