On 01/06/12 01:58, Martin Storsjö wrote:
> On Thu, 31 May 2012, Luca Barbato wrote:
>
>> Adobe specifies onTextData as the standard message to use to deliver
>> text information.
>> ---
>> libavformat/flvdec.c | 107
>> +++++++++++++++++++++++++++++++++++++++++++-------
>> libavformat/flvenc.c | 73 +++++++++++++++++++++++++++++-----
>> 2 files changed, 155 insertions(+), 25 deletions(-)
>>
>> diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
>> index b9d65a6..b6ad0a1 100644
>> --- a/libavformat/flvdec.c
>> +++ b/libavformat/flvdec.c
>> @@ -389,11 +403,11 @@ static int flv_read_header(AVFormatContext *s)
>> s->ctx_flags |= AVFMTCTX_NOHEADER;
>>
>> if(flags & FLV_HEADER_FLAG_HASVIDEO){
>> - if(!create_stream(s, 0))
>> + if(!create_stream(s, 0, AVMEDIA_TYPE_VIDEO))
>> return AVERROR(ENOMEM);
>> }
>> if(flags & FLV_HEADER_FLAG_HASAUDIO){
>> - if(!create_stream(s, 1))
>> + if(!create_stream(s, 1, AVMEDIA_TYPE_AUDIO))
>> return AVERROR(ENOMEM);
>> }
>>
>> @@ -453,6 +467,66 @@ static void clear_index_entries(AVFormatContext
>> *s, int64_t pos)
>> }
>> }
>>
>> +
>> +static int flv_data_packet(AVFormatContext *s, AVPacket *pkt,
>> + int64_t dts, int64_t next)
>> +{
>> + int ret = AVERROR_INVALIDDATA, i;
>> + AVIOContext *pb = s->pb;
>> + AVStream *st = NULL;
>> + AMFDataType type;
>> + char buf[20];
>> + int codec_id;
>> + int length;
>> +
>> + type = avio_r8(pb);
>> + if (type == AMF_DATA_TYPE_MIXEDARRAY)
>> + avio_seek(pb, 4, SEEK_CUR);
>> + else if (type != AMF_DATA_TYPE_OBJECT)
>> + goto out;
>> +
>> + amf_get_string(pb, buf, sizeof(buf));
>> + if (strcmp(buf, "type") || avio_r8(pb) != AMF_DATA_TYPE_STRING)
>> + goto out;
>> +
>> + amf_get_string(pb, buf, sizeof(buf));
>> + //FIXME parse it as codec_id
>> + amf_get_string(pb, buf, sizeof(buf));
>> + if (strcmp(buf, "text") || avio_r8(pb) != AMF_DATA_TYPE_STRING)
>> + goto out;
>> +
>> + length = avio_rb16(pb);
>> + ret = av_get_packet(s->pb, pkt, length);
>> + if (ret < 0) {
>> + ret = AVERROR(EIO);
>> + goto out;
>> + }
>> +
>> + for (i=0; i<s->nb_streams; i++) {
>> + st = s->streams[i];
>> + if (st->id == 2)
>> + break;
>> + }
>> +
>> + if (st->id != 2) {
>> + st = create_stream(s, 2, AVMEDIA_TYPE_DATA);
>
> This logic looks weird. If there are no streams at all (not sure if
> that's possible), it would segfault. If you change this check to if (i
> == s->nb_streams), this would be less fragile.
>
> Anton also had some concerns about the stream/id handling in general in
> the last review round of the patch - did you comment on that somewhere?
Either I scratch this patchset and first change the flvdec not to use id
that way at all and then add the feature or I do that in the other way
round. The patch is consistent with the current code.
>> diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
>> index 3a51aaa..c07cad2 100644
>> --- a/libavformat/flvenc.c
>> +++ b/libavformat/flvenc.c
>> @@ -187,7 +187,8 @@ static int flv_write_header(AVFormatContext *s)
>> for(i=0; i<s->nb_streams; i++){
>> AVCodecContext *enc = s->streams[i]->codec;
>> FLVStreamContext *sc;
>> - if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>> + switch (enc->codec_type) {
>> + case AVMEDIA_TYPE_VIDEO:
>> if (s->streams[i]->r_frame_rate.den &&
>> s->streams[i]->r_frame_rate.num) {
>> framerate = av_q2d(s->streams[i]->r_frame_rate);
>> } else {
>> @@ -198,10 +199,22 @@ static int flv_write_header(AVFormatContext *s)
>> av_log(s, AV_LOG_ERROR, "video codec not compatible
>> with flv\n");
>> return -1;
>> }
>> - } else {
>> + break;
>> + case AVMEDIA_TYPE_AUDIO:
>> audio_enc = enc;
>> if (get_audio_flags(s, enc) < 0)
>> - return -1;
>> + return AVERROR_INVALIDDATA;
>> + break;
>> + case AVMEDIA_TYPE_DATA:
>> + if (enc->codec_id != CODEC_ID_TEXT) {
>> + av_log(s, AV_LOG_ERROR, "codec not compatible with
>> flv\n");
>> + return AVERROR_INVALIDDATA;
>> + }
>> + data_enc = enc;
>> + break;
>> + default:
>> + av_log(s, AV_LOG_ERROR, "codec not compatible with flv\n");
>> + return -1;
>
> The placing of the breaks are weird here - I see that you fix up that in
> the third patch, but please squash the hunks that touch the newly added
> code into this one.
I'd rather keep the thing consistent. I guess I'd redo the patchset
first going over the codebase so it is cleaner, then adding this feature
and a couple others, in the end the onTextData is a couple of functions.
lu
--
Luca Barbato
Gentoo/linux
http://dev.gentoo.org/~lu_zero
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel