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?
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.
// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel