Mercurial > libavcodec.hg
comparison mpegvideo_xvmc.c @ 8916:bd643af669df libavcodec
Check all critical xvmc struct fields in ff_xvmc_field_start()
and log error if they are not correct. All other functions
are supposedly called after that one, so use assert() for them.
author | iive |
---|---|
date | Sun, 15 Feb 2009 10:06:23 +0000 |
parents | 9dd34068523e |
children | 422a9dbebb53 |
comparison
equal
deleted
inserted
replaced
8915:9dd34068523e | 8916:bd643af669df |
---|---|
36 * parameter after making sure that the data is not corrupted. | 36 * parameter after making sure that the data is not corrupted. |
37 */ | 37 */ |
38 void ff_xvmc_init_block(MpegEncContext *s) | 38 void ff_xvmc_init_block(MpegEncContext *s) |
39 { | 39 { |
40 struct xvmc_pixfmt_render *render = (struct xvmc_pixfmt_render*)s->current_picture.data[2]; | 40 struct xvmc_pixfmt_render *render = (struct xvmc_pixfmt_render*)s->current_picture.data[2]; |
41 if (!render || render->magic_id != AV_XVMC_RENDER_MAGIC) { | 41 assert(render && render->magic_id == AV_XVMC_RENDER_MAGIC); |
42 assert(0); | 42 |
43 return; // make sure that this is a render packet | |
44 } | |
45 s->block = (DCTELEM *)(render->data_blocks + render->next_free_data_block_num * 64); | 43 s->block = (DCTELEM *)(render->data_blocks + render->next_free_data_block_num * 64); |
46 } | 44 } |
47 | 45 |
48 void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp) | 46 void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp) |
49 { | 47 { |
65 * It should be safe to call the function a few times for the same field. | 63 * It should be safe to call the function a few times for the same field. |
66 */ | 64 */ |
67 int ff_xvmc_field_start(MpegEncContext*s, AVCodecContext *avctx) | 65 int ff_xvmc_field_start(MpegEncContext*s, AVCodecContext *avctx) |
68 { | 66 { |
69 struct xvmc_pixfmt_render *last, *next, *render = (struct xvmc_pixfmt_render*)s->current_picture.data[2]; | 67 struct xvmc_pixfmt_render *last, *next, *render = (struct xvmc_pixfmt_render*)s->current_picture.data[2]; |
68 const int mb_block_count = 4 + (1 << s->chroma_format); | |
70 | 69 |
71 assert(avctx); | 70 assert(avctx); |
72 if (!render || render->magic_id != AV_XVMC_RENDER_MAGIC) | 71 if (!render || render->magic_id != AV_XVMC_RENDER_MAGIC || |
72 !render->data_blocks || !render->mv_blocks){ | |
73 av_log(avctx, AV_LOG_ERROR, | |
74 "Render token doesn't look as expected.\n"); | |
73 return -1; // make sure that this is a render packet | 75 return -1; // make sure that this is a render packet |
76 } | |
74 | 77 |
75 render->picture_structure = s->picture_structure; | 78 render->picture_structure = s->picture_structure; |
76 render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD; | 79 render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD; |
77 | 80 |
78 if (render->filled_mv_blocks_num) { | 81 if (render->filled_mv_blocks_num) { |
79 av_log(avctx, AV_LOG_ERROR, | 82 av_log(avctx, AV_LOG_ERROR, |
80 "Rendering surface contains %i unprocessed blocks\n", | 83 "Rendering surface contains %i unprocessed blocks.\n", |
81 render->filled_mv_blocks_num); | 84 render->filled_mv_blocks_num); |
85 return -1; | |
86 } | |
87 if (render->total_number_of_mv_blocks < 1 || | |
88 render->total_number_of_data_blocks < mb_block_count) { | |
89 av_log(avctx, AV_LOG_ERROR, | |
90 "Rendering surface doesn't provide enough block structures to work with.\n"); | |
91 return -1; | |
92 } | |
93 if (render->total_number_of_mv_blocks < 1 || | |
94 render->total_number_of_data_blocks < mb_block_count) { | |
95 av_log(avctx, AV_LOG_ERROR, | |
96 "Rendering surface doesn't provide enough block structures to work with.\n"); | |
82 return -1; | 97 return -1; |
83 } | 98 } |
84 | 99 |
85 render->p_future_surface = NULL; | 100 render->p_future_surface = NULL; |
86 render->p_past_surface = NULL; | 101 render->p_past_surface = NULL; |