summaryrefslogtreecommitdiff
path: root/src/libvdpau/h264_parser.c
diff options
context:
space:
mode:
authorJulian Scheel <julian@jusst.de>2009-01-04 15:00:47 +0000
committerJulian Scheel <julian@jusst.de>2009-01-04 15:00:47 +0000
commit63ec09d9a95819bad3131181a3641443eb199432 (patch)
tree3fa19434b4556706cec605bd82a77120d1d17ef6 /src/libvdpau/h264_parser.c
parentf82162c8b1fac19514e767809f5fdbbb27692f82 (diff)
downloadxine-lib-63ec09d9a95819bad3131181a3641443eb199432.tar.gz
xine-lib-63ec09d9a95819bad3131181a3641443eb199432.tar.bz2
Parse sei->pic_struct for better progressive_frame marking.
Diffstat (limited to 'src/libvdpau/h264_parser.c')
-rw-r--r--src/libvdpau/h264_parser.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/libvdpau/h264_parser.c b/src/libvdpau/h264_parser.c
index bb2bad31e..fdc48f043 100644
--- a/src/libvdpau/h264_parser.c
+++ b/src/libvdpau/h264_parser.c
@@ -246,6 +246,7 @@ int parse_nal_header(struct buf_reader *buf, struct nal_parser *parser)
}
break;
case NAL_SEI:
+ memset(&(nal->sei), 0x00, sizeof(struct sei_message));
parse_sei(buf, parser);
ret = nal->nal_unit_type;
break;
@@ -470,6 +471,7 @@ uint8_t parse_sps(struct buf_reader *buf, struct nal_parser *parser)
void parse_sei(struct buf_reader *buf, struct nal_parser *parser)
{
struct sei_message *sei = &(parser->current_nal->sei);
+ struct seq_parameter_set_rbsp *sps = parser->current_nal->sps;
uint8_t tmp;
sei->payload_type = 0;
@@ -492,6 +494,35 @@ void parse_sei(struct buf_reader *buf, struct nal_parser *parser)
sei->pic_timing.cpb_removal_delay = read_bits(buf, 5);
sei->pic_timing.dpb_output_delay = read_bits(buf, 5);
}
+
+ if(sps && sps->vui_parameters_present_flag &&
+ sps->vui_parameters.pic_struct_present_flag) {
+ sei->pic_timing.pic_struct = read_bits(buf, 4);
+ switch(sei->pic_timing.pic_struct) {
+ case DISP_FRAME:
+ parser->current_nal->interlaced = 0;
+ parser->current_nal->repeat_pic = 0;
+ break;
+ case DISP_TOP:
+ case DISP_BOTTOM:
+ case DISP_TOP_BOTTOM:
+ case DISP_BOTTOM_TOP:
+ parser->current_nal->interlaced = 1;
+ break;
+ case DISP_TOP_BOTTOM_TOP:
+ case DISP_BOTTOM_TOP_BOTTOM:
+ parser->current_nal->interlaced = 1;
+ parser->current_nal->repeat_pic = 1;
+ break;
+ case DISP_FRAME_DOUBLING:
+ parser->current_nal->interlaced = 0;
+ parser->current_nal->repeat_pic = 2;
+ break;
+ case DISP_FRAME_TRIPLING:
+ parser->current_nal->interlaced = 0;
+ parser->current_nal->repeat_pic = 3;
+ }
+ }
}
}