avformat/flvdec: add support for OnCaption
This commit is contained in:
		
							parent
							
								
									1df64d6c46
								
							
						
					
					
						commit
						3727cd5416
					
				@ -546,7 +546,8 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TYPE_ONTEXTDATA 1
 | 
					#define TYPE_ONTEXTDATA 1
 | 
				
			||||||
#define TYPE_UNKNOWN 2
 | 
					#define TYPE_ONCAPTION 2
 | 
				
			||||||
 | 
					#define TYPE_UNKNOWN 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
 | 
					static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -573,6 +574,9 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
 | 
				
			|||||||
    if (!strcmp(buffer, "onTextData"))
 | 
					    if (!strcmp(buffer, "onTextData"))
 | 
				
			||||||
        return TYPE_ONTEXTDATA;
 | 
					        return TYPE_ONTEXTDATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!strcmp(buffer, "onCaption"))
 | 
				
			||||||
 | 
					        return TYPE_ONCAPTION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint"))
 | 
					    if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint"))
 | 
				
			||||||
        return TYPE_UNKNOWN;
 | 
					        return TYPE_UNKNOWN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -717,8 +721,11 @@ static int flv_data_packet(AVFormatContext *s, AVPacket *pkt,
 | 
				
			|||||||
    char buf[20];
 | 
					    char buf[20];
 | 
				
			||||||
    int ret = AVERROR_INVALIDDATA;
 | 
					    int ret = AVERROR_INVALIDDATA;
 | 
				
			||||||
    int i, length = -1;
 | 
					    int i, length = -1;
 | 
				
			||||||
 | 
					    int array = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (avio_r8(pb)) {
 | 
					    switch (avio_r8(pb)) {
 | 
				
			||||||
 | 
					    case AMF_DATA_TYPE_ARRAY:
 | 
				
			||||||
 | 
					        array = 1;
 | 
				
			||||||
    case AMF_DATA_TYPE_MIXEDARRAY:
 | 
					    case AMF_DATA_TYPE_MIXEDARRAY:
 | 
				
			||||||
        avio_seek(pb, 4, SEEK_CUR);
 | 
					        avio_seek(pb, 4, SEEK_CUR);
 | 
				
			||||||
    case AMF_DATA_TYPE_OBJECT:
 | 
					    case AMF_DATA_TYPE_OBJECT:
 | 
				
			||||||
@ -727,9 +734,9 @@ static int flv_data_packet(AVFormatContext *s, AVPacket *pkt,
 | 
				
			|||||||
        goto skip;
 | 
					        goto skip;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while ((ret = amf_get_string(pb, buf, sizeof(buf))) > 0) {
 | 
					    while (array || (ret = amf_get_string(pb, buf, sizeof(buf))) > 0) {
 | 
				
			||||||
        AMFDataType type = avio_r8(pb);
 | 
					        AMFDataType type = avio_r8(pb);
 | 
				
			||||||
        if (type == AMF_DATA_TYPE_STRING && !strcmp(buf, "text")) {
 | 
					        if (type == AMF_DATA_TYPE_STRING && (array || !strcmp(buf, "text"))) {
 | 
				
			||||||
            length = avio_rb16(pb);
 | 
					            length = avio_rb16(pb);
 | 
				
			||||||
            ret    = av_get_packet(pb, pkt, length);
 | 
					            ret    = av_get_packet(pb, pkt, length);
 | 
				
			||||||
            if (ret < 0)
 | 
					            if (ret < 0)
 | 
				
			||||||
@ -839,6 +846,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
 | 
				
			|||||||
                } else if (type == TYPE_ONTEXTDATA) {
 | 
					                } else if (type == TYPE_ONTEXTDATA) {
 | 
				
			||||||
                    avpriv_request_sample(s, "OnTextData packet");
 | 
					                    avpriv_request_sample(s, "OnTextData packet");
 | 
				
			||||||
                    return flv_data_packet(s, pkt, dts, next);
 | 
					                    return flv_data_packet(s, pkt, dts, next);
 | 
				
			||||||
 | 
					                } else if (type == TYPE_ONCAPTION) {
 | 
				
			||||||
 | 
					                    return flv_data_packet(s, pkt, dts, next);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                avio_seek(s->pb, meta_pos, SEEK_SET);
 | 
					                avio_seek(s->pb, meta_pos, SEEK_SET);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -955,6 +964,8 @@ retry_duration:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
 | 
					    } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
 | 
				
			||||||
        size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1);
 | 
					        size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1);
 | 
				
			||||||
 | 
					    } else if (stream_type == FLV_STREAM_TYPE_DATA) {
 | 
				
			||||||
 | 
					        st->codec->codec_id = AV_CODEC_ID_TEXT;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (st->codec->codec_id == AV_CODEC_ID_AAC ||
 | 
					    if (st->codec->codec_id == AV_CODEC_ID_AAC ||
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user