|
|
|
@ -27,11 +27,6 @@ |
|
|
|
|
#define MAX_YUV4_HEADER 80 |
|
|
|
|
#define MAX_FRAME_HEADER 80 |
|
|
|
|
|
|
|
|
|
struct frame_attributes { |
|
|
|
|
int interlaced_frame; |
|
|
|
|
int top_field_first; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int yuv4_read_header(AVFormatContext *s) |
|
|
|
|
{ |
|
|
|
|
char header[MAX_YUV4_HEADER + 10]; // Include headroom for
|
|
|
|
@ -44,7 +39,7 @@ static int yuv4_read_header(AVFormatContext *s) |
|
|
|
|
enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE, alt_pix_fmt = AV_PIX_FMT_NONE; |
|
|
|
|
enum AVChromaLocation chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; |
|
|
|
|
AVStream *st; |
|
|
|
|
struct frame_attributes *s1 = s->priv_data; |
|
|
|
|
enum AVFieldOrder field_order; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_YUV4_HEADER; i++) { |
|
|
|
|
header[i] = avio_r8(pb); |
|
|
|
@ -60,8 +55,6 @@ static int yuv4_read_header(AVFormatContext *s) |
|
|
|
|
if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC))) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
s1->interlaced_frame = 0; |
|
|
|
|
s1->top_field_first = 0; |
|
|
|
|
header_end = &header[i + 1]; // Include space
|
|
|
|
|
for (tokstart = &header[strlen(Y4M_MAGIC) + 1]; |
|
|
|
|
tokstart < header_end; tokstart++) { |
|
|
|
@ -112,17 +105,16 @@ static int yuv4_read_header(AVFormatContext *s) |
|
|
|
|
case 'I': // Interlace type
|
|
|
|
|
switch (*tokstart++){ |
|
|
|
|
case '?': |
|
|
|
|
field_order = AV_FIELD_UNKNOWN; |
|
|
|
|
break; |
|
|
|
|
case 'p': |
|
|
|
|
s1->interlaced_frame = 0; |
|
|
|
|
field_order = AV_FIELD_PROGRESSIVE; |
|
|
|
|
break; |
|
|
|
|
case 't': |
|
|
|
|
s1->interlaced_frame = 1; |
|
|
|
|
s1->top_field_first = 1; |
|
|
|
|
field_order = AV_FIELD_TT; |
|
|
|
|
break; |
|
|
|
|
case 'b': |
|
|
|
|
s1->interlaced_frame = 1; |
|
|
|
|
s1->top_field_first = 0; |
|
|
|
|
field_order = AV_FIELD_BB; |
|
|
|
|
break; |
|
|
|
|
case 'm': |
|
|
|
|
av_log(s, AV_LOG_ERROR, "YUV4MPEG stream contains mixed " |
|
|
|
@ -202,6 +194,7 @@ static int yuv4_read_header(AVFormatContext *s) |
|
|
|
|
st->codec->codec_id = AV_CODEC_ID_RAWVIDEO; |
|
|
|
|
st->sample_aspect_ratio = (AVRational){ aspectn, aspectd }; |
|
|
|
|
st->codec->chroma_sample_location = chroma_sample_location; |
|
|
|
|
st->codec->field_order = field_order; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -212,7 +205,6 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
|
char header[MAX_FRAME_HEADER+1]; |
|
|
|
|
int packet_size, width, height, ret; |
|
|
|
|
AVStream *st = s->streams[0]; |
|
|
|
|
struct frame_attributes *s1 = s->priv_data; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_FRAME_HEADER; i++) { |
|
|
|
|
header[i] = avio_r8(s->pb); |
|
|
|
@ -244,11 +236,6 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
|
else if (ret != packet_size) |
|
|
|
|
return s->pb->eof_reached ? AVERROR_EOF : AVERROR(EIO); |
|
|
|
|
|
|
|
|
|
if (st->codec->coded_frame) { |
|
|
|
|
st->codec->coded_frame->interlaced_frame = s1->interlaced_frame; |
|
|
|
|
st->codec->coded_frame->top_field_first = s1->top_field_first; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pkt->stream_index = 0; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -265,7 +252,6 @@ static int yuv4_probe(AVProbeData *pd) |
|
|
|
|
AVInputFormat ff_yuv4mpegpipe_demuxer = { |
|
|
|
|
.name = "yuv4mpegpipe", |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"), |
|
|
|
|
.priv_data_size = sizeof(struct frame_attributes), |
|
|
|
|
.read_probe = yuv4_probe, |
|
|
|
|
.read_header = yuv4_read_header, |
|
|
|
|
.read_packet = yuv4_read_packet, |
|
|
|
|