#define TYPE_ONTEXTDATA 1
#define TYPE_ONCAPTION 2
+#define TYPE_ONCAPTIONINFO 3
#define TYPE_UNKNOWN 9
static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
int i;
// only needs to hold the string "onMetaData".
// Anything longer is something we don't want.
- char buffer[11];
+ char buffer[32];
astream = NULL;
vstream = NULL;
if (!strcmp(buffer, "onCaption"))
return TYPE_ONCAPTION;
- if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint"))
+ if (!strcmp(buffer, "onCaptionInfo"))
+ return TYPE_ONCAPTIONINFO;
+
+ if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint")) {
+ av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer);
return TYPE_UNKNOWN;
+ }
// find the streams now so that amf_parse_object doesn't need to do
// the lookup every time it is called.
static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
{
FLVContext *flv = s->priv_data;
- int ret, i, type, size, flags;
+ int ret, i, size, flags;
+ enum FlvTagType type;
int stream_type=-1;
int64_t next, pos, meta_pos;
int64_t dts, pts = AV_NOPTS_VALUE;
int type;
meta_pos = avio_tell(s->pb);
type = flv_read_metabody(s, next);
- if (type == 0 && dts == 0 || type < 0) {
+ if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) {
goto skip;
} else if (type == TYPE_ONTEXTDATA) {
avpriv_request_sample(s, "OnTextData packet");
}
av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard);
- if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
- stream_type == FLV_STREAM_TYPE_AUDIO)
+ if (s->pb->seekable &&
+ ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
+ stream_type == FLV_STREAM_TYPE_AUDIO))
av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
if ( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO)))