comparison libavcodec/h264_ompss.c @ 3:0b056460c67d

changed code to use VSs
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Mon, 29 Oct 2012 16:44:27 +0100
parents 897f711a7157
children 96e628866d41
comparison
equal deleted inserted replaced
0:cad5b3926624 1:69df04756016
25 #include "h264_rec.h" 25 #include "h264_rec.h"
26 #include "h264_pred_mode.h" 26 #include "h264_pred_mode.h"
27 #include "h264_misc.h" 27 #include "h264_misc.h"
28 // #undef NDEBUG 28 // #undef NDEBUG
29 #include <assert.h> 29 #include <assert.h>
30 30 #include "VSs_impl/VSs.h"
31 #pragma omp task inout(*pc, *nc) output(*sbe) 31
32 static void parse_task(H264Context *h, ParserContext *pc, NalContext *nc, SliceBufferEntry *sbe){ 32 typedef struct{
33 ParserContext *pc;
34 NalContext *nc;
35 SliceBufferEntry *sbe;
36 H264Context *h;
37 } parse_taskArgs;
38
39 int32 parse_taskArgTypes[4] = {INOUT, INOUT, OUTPUT, NONCTLD};
40 int32 parse_taskArgSizes[4] = {sizeof(ParserContext), sizeof(NalContext), sizeof(SliceBufferEntry), sizeof(H264Context)};
41
42 //#pragma omp task inout(*pc, *nc) output(*sbe)
43 static void parse_task(void *_data, SlaveVP *animatingSlv){
44 parse_taskArgs* args = (parse_taskArgs*) _data;
45 ParserContext *pc = args->pc;
46 NalContext *nc = args->nc;
47 SliceBufferEntry *sbe = args->sbe;
48 H264Context *h = args->h;
33 H264Slice *s; 49 H264Slice *s;
34 50
35 if (!sbe->initialized){ 51 if (!sbe->initialized){
36 init_sb_entry(h, sbe); 52 init_sb_entry(h, sbe);
37 sbe->lines_total=h->mb_height; 53 sbe->lines_total=h->mb_height;
39 55
40 av_read_frame_internal(pc, &sbe->gb); 56 av_read_frame_internal(pc, &sbe->gb);
41 s = &sbe->slice; 57 s = &sbe->slice;
42 58
43 decode_nal_units(nc, s, &sbe->gb); 59 decode_nal_units(nc, s, &sbe->gb);
44 } 60
45 61 VSs__end_task( animatingSlv );
46 #pragma omp task inout(*ec) inout(*sbe) 62 }
47 static void decode_slice_entropy_task(H264Context *h, EntropyContext *ec, SliceBufferEntry *sbe){ 63
64 VSsTaskType parse_taskType = {
65 .fn = &parse_task,
66 .numCtldArgs = 3,
67 .numTotalArgs = 4,
68 .sizeOfArgs = sizeof(parse_taskArgs),
69 .argTypes = parse_taskArgTypes,
70 .argSizes = parse_taskArgSizes};
71
72
73 typedef struct{
74 EntropyContext *ec;
75 SliceBufferEntry *sbe;
76 H264Context *h;
77 } decode_slice_entropy_taskArgs;
78
79 int32 decode_slice_entropy_taskArgTypes[3] = {INOUT, INOUT, NONCTLD};
80 int32 decode_slice_entropy_taskArgSizes[3] = {sizeof(EntropyContext), sizeof(SliceBufferEntry), sizeof(H264Context)};
81
82 //#pragma omp task inout(*ec) inout(*sbe)
83 static void decode_slice_entropy_task(void *_data, SlaveVP *animatingSlv){
84 decode_slice_entropy_taskArgs* args = (decode_slice_entropy_taskArgs*) _data;
85 EntropyContext *ec = args->ec;
86 SliceBufferEntry *sbe = args->sbe;
87 H264Context *h = args->h;
48 int i,j; 88 int i,j;
49 H264Slice *s = &sbe->slice; 89 H264Slice *s = &sbe->slice;
50 GetBitContext *gb = &sbe->gb; 90 GetBitContext *gb = &sbe->gb;
51 H264Mb *mbs = sbe->mbs; 91 H264Mb *mbs = sbe->mbs;
52 // GetBitContext *gb = s->gb; 92 // GetBitContext *gb = s->gb;
53 CABACContext *c = &ec->c; 93 CABACContext *c = &ec->c;
54 94
55 if( !s->pps.cabac ){ 95 if( !s->pps.cabac ){
56 av_log(AV_LOG_ERROR, "Only cabac encoded streams are supported\n"); 96 av_log(AV_LOG_ERROR, "Only cabac encoded streams are supported\n");
57 return ; 97 VSs__end_task( animatingSlv );
58 } 98 }
59 99
60 init_dequant_tables(s, ec); 100 init_dequant_tables(s, ec);
61 ec->curr_qscale = s->qscale; 101 ec->curr_qscale = s->qscale;
62 ec->last_qscale_diff = 0; 102 ec->last_qscale_diff = 0;
82 ret = ff_h264_decode_mb_cabac(ec, s, c); 122 ret = ff_h264_decode_mb_cabac(ec, s, c);
83 eos = get_cabac_terminate( c); 123 eos = get_cabac_terminate( c);
84 (void) eos; 124 (void) eos;
85 if( ret < 0 || c->bytestream > c->bytestream_end + 2) { 125 if( ret < 0 || c->bytestream > c->bytestream_end + 2) {
86 av_log(AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", m->mb_x, m->mb_y, c->bytestream_end - c->bytestream); 126 av_log(AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", m->mb_x, m->mb_y, c->bytestream_end - c->bytestream);
87 return ; 127 VSs__end_task( animatingSlv );
88 } 128 }
89 } 129 }
90 } 130 }
91 } 131 VSs__end_task( animatingSlv );
132 }
133
134 VSsTaskType decode_slice_entropy_taskType = {
135 .fn = &decode_slice_entropy_task,
136 .numCtldArgs = 2,
137 .numTotalArgs = 3,
138 .sizeOfArgs = sizeof(decode_slice_entropy_taskArgs),
139 .argTypes = decode_slice_entropy_taskArgTypes,
140 .argSizes = decode_slice_entropy_taskArgSizes};
141
92 142
93 static void decode_super_mb_block(MBRecContext *d, H264Slice *s, SuperMBContext *smbc, H264Mb *mbs, int smb_x, int smb_y){ 143 static void decode_super_mb_block(MBRecContext *d, H264Slice *s, SuperMBContext *smbc, H264Mb *mbs, int smb_x, int smb_y){
94 MBRecState mrs; 144 MBRecState mrs;
95 // memset(&mrs, 0, sizeof(MBRecState)); 145 // memset(&mrs, 0, sizeof(MBRecState));
96 146
102 } 152 }
103 } 153 }
104 } 154 }
105 } 155 }
106 156
107 #pragma omp task input(*d, *sbe, *ml, *mur) inout(*m) 157 typedef struct{
108 static void decode_super_mb_task(MBRecContext *d, SliceBufferEntry *sbe, SuperMBContext *smbc, SuperMBTask *ml, 158 MBRecContext *d;
109 SuperMBTask *mur, SuperMBTask *m){ 159 SliceBufferEntry *sbe;
160 SuperMBTask *ml;
161 SuperMBTask *mur;
162 SuperMBTask *m;
163 SuperMBContext *smbc;
164 } decode_super_mb_taskArgs;
165
166 int32 decode_super_mb_taskArgTypes[6] = {IN, IN, IN, IN, INOUT, NONCTLD};
167 int32 decode_super_mb_taskArgSizes[6] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(SuperMBTask), sizeof(SuperMBTask), sizeof(SuperMBTask), sizeof(SuperMBContext)};
168
169 //#pragma omp task input(*d, *sbe, *ml, *mur) inout(*m)
170 static void decode_super_mb_task(void *_data, SlaveVP *animatingSlv){
171 decode_super_mb_taskArgs* args = (decode_super_mb_taskArgs*) _data;
172 MBRecContext *d = args->d;
173 SliceBufferEntry *sbe = args->sbe;
174 SuperMBTask *ml = args->ml;
175 SuperMBTask *mur = args->mur;
176 SuperMBTask *m = args->m;
177 SuperMBContext *smbc = args->smbc;
110 H264Slice *s = &sbe->slice; 178 H264Slice *s = &sbe->slice;
111 H264Mb *mbs = sbe->mbs; 179 H264Mb *mbs = sbe->mbs;
112 decode_super_mb_block(d, s, smbc, mbs, m->smb_x, m->smb_y); 180 decode_super_mb_block(d, s, smbc, mbs, m->smb_x, m->smb_y);
113 } 181 VSs__end_task( animatingSlv );
114 182 }
115 #pragma omp task input(*d, *sbe) inout(*sm) 183
116 static void draw_edges_task(MBRecContext *d, SliceBufferEntry *sbe, SuperMBContext *smbc, SuperMBTask *sm, int line){ 184 VSsTaskType decode_super_mb_taskType = {
185 .fn = &decode_super_mb_task,
186 .numCtldArgs = 5,
187 .numTotalArgs = 6,
188 .sizeOfArgs = sizeof(decode_super_mb_taskArgs),
189 .argTypes = decode_super_mb_taskArgTypes,
190 .argSizes = decode_super_mb_taskArgSizes};
191
192
193
194 typedef struct{
195 MBRecContext *d;
196 SliceBufferEntry *sbe;
197 SuperMBTask *sm;
198 SuperMBContext *smbc;
199 int* line;
200 } draw_edges_taskArgs;
201
202 int32 draw_edges_taskArgTypes[5] = {IN, IN, INOUT, NONCTLD, NONCTLD};
203 int32 draw_edges_taskArgSizes[5] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(SuperMBTask),sizeof(SuperMBContext),sizeof(int)};
204
205 //#pragma omp task input(*d, *sbe) inout(*sm)
206 static void draw_edges_task(void *_data, SlaveVP *animatingSlv){
207 draw_edges_taskArgs* args = (draw_edges_taskArgs*) _data;
208 MBRecContext *d = args->d;
209 SliceBufferEntry *sbe = args->sbe;
210 SuperMBTask *sm = args->sm;
211 SuperMBContext *smbc = args->smbc;
212 int line = *(args->line);
117 H264Slice *s = &sbe->slice; 213 H264Slice *s = &sbe->slice;
118 for (int i=line*smbc->smb_height; i< (line+1)*smbc->smb_height && i< d->mb_height; i++) 214 for (int i=line*smbc->smb_height; i< (line+1)*smbc->smb_height && i< d->mb_height; i++)
119 draw_edges(d, s, i); 215 draw_edges(d, s, i);
120 } 216 VSs__end_task( animatingSlv );
121 217 }
122 static void decode_mb_in_slice(H264Context *h, MBRecContext *d, SliceBufferEntry *sbe){ 218 VSsTaskType draw_edges_taskType = {
219 .fn = &draw_edges_task,
220 .numCtldArgs = 3,
221 .numTotalArgs = 5,
222 .sizeOfArgs = sizeof(draw_edges_taskArgs),
223 .argTypes = draw_edges_taskArgTypes,
224 .argSizes = draw_edges_taskArgSizes};
225
226
227 static void decode_mb_in_slice(H264Context *h, MBRecContext *d, SliceBufferEntry *sbe, SlaveVP* animSlv){
123 int i,j; 228 int i,j;
124 229
125 SuperMBContext *smbc = acquire_smbc(h); 230 SuperMBContext *smbc = acquire_smbc(h);
126 int smb_height =smbc->nsmb_height, smb_width= smbc->nsmb_width; 231 int smb_height =smbc->nsmb_height, smb_width= smbc->nsmb_width;
127 SuperMBTask *smbs = smbc->smbs[0]; 232 SuperMBTask *smbs = smbc->smbs[0];
130 for(j=0; j< smb_height; j++){ 235 for(j=0; j< smb_height; j++){
131 for(i=0; i< smb_width; i++){ 236 for(i=0; i< smb_width; i++){
132 sm = smbs + j*smb_width + i; 237 sm = smbs + j*smb_width + i;
133 sml = sm - ((i > 0) ? 1: 0); 238 sml = sm - ((i > 0) ? 1: 0);
134 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0); 239 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0);
135 decode_super_mb_task(d, sbe, smbc, sml, smur, sm); 240 decode_super_mb_taskArgs decode_super_mb_task_args;
136 } 241 decode_super_mb_task_args.d = d;
137 draw_edges_task(d, sbe, smbc, sm, j); 242 decode_super_mb_task_args.sbe = sbe;
138 } 243 decode_super_mb_task_args.smbc = smbc;
139 #pragma omp taskwait on(*sm) 244 decode_super_mb_task_args.ml = sml;
245 decode_super_mb_task_args.mur = smur;
246 decode_super_mb_task_args.m = sm;
247 VSs__submit_task(&decode_super_mb_taskType, &decode_super_mb_task_args, animSlv);
248 }
249 draw_edges_taskArgs draw_edges_task_args;
250 draw_edges_task_args.d = d;
251 draw_edges_task_args.sbe = sbe;
252 draw_edges_task_args.sm = sm;
253 draw_edges_task_args.smbc = smbc;
254 draw_edges_task_args.line = VMS_App__malloc( sizeof(int) );
255 *(draw_edges_task_args.line) = j;
256 VSs__submit_task(&draw_edges_taskType, &draw_edges_task_args, animSlv);
257 }
258 VSs__taskwait_on(animSlv,sm);
259 //#pragma omp taskwait on(*sm)
140 260
141 release_smbc(h, smbc); 261 release_smbc(h, smbc);
142 } 262 }
143 263
144 #pragma omp task inout(*d) inout(*sbe) 264 typedef struct{
145 static void decode_slice_mb_task(H264Context *h, MBRecContext *d, SliceBufferEntry *sbe){ 265 MBRecContext *d;
266 SliceBufferEntry *sbe;
267 H264Context *h;
268 } decode_slice_mb_taskArgs;
269
270 int32 decode_slice_mb_taskArgTypes[3] = {INOUT, INOUT, NONCTLD};
271 int32 decode_slice_mb_taskArgSizes[3] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(H264Context)};
272
273 //#pragma omp task inout(*d) inout(*sbe)
274 static void decode_slice_mb_task(void *_data, SlaveVP *animatingSlv){
275 decode_slice_mb_taskArgs* args = (decode_slice_mb_taskArgs*) _data;
276 MBRecContext *d = args->d;
277 SliceBufferEntry *sbe = args->sbe;
278 H264Context *h = args->h;
279
146 H264Slice *s = &sbe->slice; 280 H264Slice *s = &sbe->slice;
147 281
148 for (int i=0; i<2; i++){ 282 for (int i=0; i<2; i++){
149 for(int j=0; j< s->ref_count[i]; j++){ 283 for(int j=0; j< s->ref_count[i]; j++){
150 if (s->ref_list_cpn[i][j] ==-1) 284 if (s->ref_list_cpn[i][j] ==-1)
157 } 291 }
158 } 292 }
159 } 293 }
160 } 294 }
161 295
162 #pragma omp critical (dpb) 296 //#pragma omp critical (dpb)
297 VSs__start_critical(animatingSlv,0);
163 get_dpb_entry(h, s); 298 get_dpb_entry(h, s);
164 299 VSs__end_critical(animatingSlv,0);
300
165 if (!h->no_mbd){ 301 if (!h->no_mbd){
166 decode_mb_in_slice (h, d, sbe); 302 decode_mb_in_slice (h, d, sbe, animatingSlv);
167 } 303 }
168 304
169 for (int i=0; i<s->release_cnt; i++){ 305 for (int i=0; i<s->release_cnt; i++){
170 for(int j=0; j<h->max_dpb_cnt; j++){ 306 for(int j=0; j<h->max_dpb_cnt; j++){
171 if(h->dpb[j].cpn== s->release_ref_cpn[i]){ 307 if(h->dpb[j].cpn== s->release_ref_cpn[i]){
172 #pragma omp critical (dpb) 308 //#pragma omp critical (dpb)
309 VSs__start_critical(animatingSlv,0);
173 release_dpb_entry(h, &h->dpb[j], 2); 310 release_dpb_entry(h, &h->dpb[j], 2);
311 VSs__end_critical(animatingSlv,0);
174 break; 312 break;
175 } 313 }
176 } 314 }
177 } 315 }
178 s->release_cnt=0; 316 s->release_cnt=0;
179 } 317 VSs__end_task( animatingSlv );
318 }
319
320 VSsTaskType decode_slice_mb_taskType = {
321 .fn = &decode_slice_mb_task,
322 .numCtldArgs = 2,
323 .numTotalArgs = 3,
324 .sizeOfArgs = sizeof(decode_slice_mb_taskArgs),
325 .argTypes = decode_slice_mb_taskArgTypes,
326 .argSizes = decode_slice_mb_taskArgSizes};
180 327
181 // for static 3d wave 328 // for static 3d wave
182 /*-------------------------------------------------------------------------------*/ 329 /*-------------------------------------------------------------------------------*/
183 #pragma omp task input(*d, *sbe, *ml, *mur, *mprev) inout(*m) 330 typedef struct{
184 static void decode_3dwave_super_mb_task(MBRecContext *d, SliceBufferEntry *sbe, SuperMBContext *smbc, SuperMBTask *ml, 331 MBRecContext *d;
185 SuperMBTask *mur, SuperMBTask *mprev, SuperMBTask *m){ 332 SliceBufferEntry *sbe;
333 SuperMBTask *ml;
334 SuperMBTask *mur;
335 SuperMBTask *mprev;
336 SuperMBTask *m;
337 SuperMBContext *smbc;
338 } decode_3dwave_super_mb_taskArgs;
339
340 int32 decode_3dwave_super_mb_taskArgTypes[7] = {IN, IN, IN, IN, IN, INOUT, NONCTLD};
341 int32 decode_3dwave_super_mb_taskArgSizes[7] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(SuperMBTask),
342 sizeof(SuperMBTask), sizeof(SuperMBTask), sizeof(SuperMBTask), sizeof(SuperMBContext)};
343
344 //#pragma omp task input(*d, *sbe, *ml, *mur, *mprev) inout(*m)
345 static void decode_3dwave_super_mb_task(void *_data, SlaveVP *animatingSlv){
346 decode_3dwave_super_mb_taskArgs* args = (decode_3dwave_super_mb_taskArgs*) _data;
347 MBRecContext *d = args->d;
348 SliceBufferEntry *sbe = args->sbe;
349 SuperMBTask *ml = args->ml;
350 SuperMBTask *mur = args->mur;
351 SuperMBTask *mprev = args->mprev;
352 SuperMBTask *m = args->m;
353 SuperMBContext *smbc = args->smbc;
354
186 H264Slice *s = &sbe->slice; 355 H264Slice *s = &sbe->slice;
187 H264Mb *mbs = sbe->mbs; 356 H264Mb *mbs = sbe->mbs;
188 357
189 decode_super_mb_block(d, s, smbc, mbs, m->smb_x, m->smb_y); 358 decode_super_mb_block(d, s, smbc, mbs, m->smb_x, m->smb_y);
190 } 359 VSs__end_task( animatingSlv );
360 }
361
362 VSsTaskType decode_3dwave_super_mb_taskType = {
363 .fn = &decode_3dwave_super_mb_task,
364 .numCtldArgs = 6,
365 .numTotalArgs = 7,
366 .sizeOfArgs = sizeof(decode_3dwave_super_mb_taskArgs),
367 .argTypes = decode_3dwave_super_mb_taskArgTypes,
368 .argSizes = decode_3dwave_super_mb_taskArgSizes};
191 369
192 // int init_ref_count=0; 370 // int init_ref_count=0;
193 #pragma omp task inout(*d, *sbe, *init) 371 typedef struct{
194 static void init_ref_list_and_get_dpb_task(H264Context *h, MBRecContext *d, SliceBufferEntry *sbe, int *init){ 372 MBRecContext *d;
373 SliceBufferEntry *sbe;
374 int* init;
375 H264Context *h;
376 } init_ref_list_and_get_dpb_taskArgs;
377
378 int32 init_ref_list_and_get_dpb_taskArgTypes[4] = {INOUT, INOUT, INOUT, NONCTLD};
379 int32 init_ref_list_and_get_dpb_taskArgSizes[4] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(int), sizeof(H264Context)};
380
381 //#pragma omp task inout(*d, *sbe, *init)
382 static void init_ref_list_and_get_dpb_task(void *_data, SlaveVP *animatingSlv){
383 init_ref_list_and_get_dpb_taskArgs* args = (init_ref_list_and_get_dpb_taskArgs*) _data;
384 MBRecContext *d = args->d;
385 SliceBufferEntry *sbe = args->sbe;
386 int* initp = args->init;
387 H264Context *h = args->h;
388
195 H264Slice *s = &sbe->slice; 389 H264Slice *s = &sbe->slice;
196 for (int i=0; i<2; i++){ 390 for (int i=0; i<2; i++){
197 for(int j=0; j< s->ref_count[i]; j++){ 391 for(int j=0; j< s->ref_count[i]; j++){
198 if (s->ref_list_cpn[i][j] ==-1) 392 if (s->ref_list_cpn[i][j] ==-1)
199 continue; 393 continue;
205 } 399 }
206 } 400 }
207 } 401 }
208 } 402 }
209 403
210 #pragma omp critical (dpb) 404 //#pragma omp critical (dpb)
405 VSs__start_critical(animatingSlv,0);
211 get_dpb_entry(h, s); 406 get_dpb_entry(h, s);
212 407 VSs__end_critical(animatingSlv,0);
213 } 408
214 409 VSs__end_task( animatingSlv );
215 static SuperMBTask* add_decode_slice_3dwave_tasks(MBRecContext *d, SliceBufferEntry *sbe, SuperMBContext *smbc){ 410 }
411
412 VSsTaskType init_ref_list_and_get_dpb_taskType = {
413 .fn = &init_ref_list_and_get_dpb_task,
414 .numCtldArgs = 3,
415 .numTotalArgs = 4,
416 .sizeOfArgs = sizeof(init_ref_list_and_get_dpb_taskArgs),
417 .argTypes = init_ref_list_and_get_dpb_taskArgTypes,
418 .argSizes = init_ref_list_and_get_dpb_taskArgSizes};
419
420 static SuperMBTask* add_decode_slice_3dwave_tasks(MBRecContext *d, SliceBufferEntry *sbe, SuperMBContext *smbc, SlaveVP* animSlv){
216 int i,j; 421 int i,j;
217 422
218 int smb_3d_height =smbc->nsmb_3dheight; 423 int smb_3d_height =smbc->nsmb_3dheight;
219 int smb_height =smbc->nsmb_height, smb_width= smbc->nsmb_width; 424 int smb_height =smbc->nsmb_height, smb_width= smbc->nsmb_width;
220 int smb_diff_prev = smb_height - smb_3d_height; 425 int smb_diff_prev = smb_height - smb_3d_height;
227 for(i=0; i< smb_width; i++){ 432 for(i=0; i< smb_width; i++){
228 sm = smbs + j*smb_width + i; 433 sm = smbs + j*smb_width + i;
229 sml = sm - ((i > 0) ? 1: 0); 434 sml = sm - ((i > 0) ? 1: 0);
230 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0); 435 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0);
231 smprev = smbs_prev + (j + smb_diff_prev+1)*smb_width -1; 436 smprev = smbs_prev + (j + smb_diff_prev+1)*smb_width -1;
232 decode_3dwave_super_mb_task(d, sbe, smbc, sml, smur, smprev, sm); 437 decode_3dwave_super_mb_taskArgs decode_3dwave_super_mb_task_args;
233 } 438 decode_3dwave_super_mb_task_args.d = d;
234 draw_edges_task(d, sbe, smbc, sm, j); 439 decode_3dwave_super_mb_task_args.sbe = sbe;
440 decode_3dwave_super_mb_task_args.smbc = smbc;
441 decode_3dwave_super_mb_task_args.ml = sml;
442 decode_3dwave_super_mb_task_args.mur = smur;
443 decode_3dwave_super_mb_task_args.mprev = smprev;
444 decode_3dwave_super_mb_task_args.m = sm;
445 VSs__submit_task(&decode_3dwave_super_mb_taskType, &decode_3dwave_super_mb_task_args, animSlv);
446 }
447 draw_edges_taskArgs draw_edges_task_args;
448 draw_edges_task_args.d = d;
449 draw_edges_task_args.sbe = sbe;
450 draw_edges_task_args.sm = sm;
451 draw_edges_task_args.smbc = smbc;
452 draw_edges_task_args.line = VMS_App__malloc( sizeof(int) );
453 *(draw_edges_task_args.line) = j;
454 VSs__submit_task(&draw_edges_taskType, &draw_edges_task_args, animSlv);
235 } 455 }
236 456
237 for(; j< smb_height; j++){ 457 for(; j< smb_height; j++){
238 for(i=0; i< smb_width; i++){ 458 for(i=0; i< smb_width; i++){
239 sm = smbs + j*smb_width + i; 459 sm = smbs + j*smb_width + i;
240 sml = sm - ((i > 0) ? 1: 0); 460 sml = sm - ((i > 0) ? 1: 0);
241 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0); 461 smur = sm + (((i < smb_width-1) && (j >0)) ? -smb_width+1: 0);
242 decode_super_mb_task(d, sbe, smbc, sml, smur, sm); 462 decode_super_mb_taskArgs decode_super_mb_task_args;
243 } 463 decode_super_mb_task_args.d = d;
244 draw_edges_task(d, sbe, smbc, sm, j); 464 decode_super_mb_task_args.sbe = sbe;
465 decode_super_mb_task_args.smbc = smbc;
466 decode_super_mb_task_args.ml = sml;
467 decode_super_mb_task_args.mur = smur;
468 decode_super_mb_task_args.m = sm;
469 VSs__submit_task(&decode_super_mb_taskType, &decode_super_mb_task_args, animSlv);
470 }
471 draw_edges_taskArgs draw_edges_task_args;
472 draw_edges_task_args.d = d;
473 draw_edges_task_args.sbe = sbe;
474 draw_edges_task_args.sm = sm;
475 draw_edges_task_args.smbc = smbc;
476 draw_edges_task_args.line = VMS_App__malloc( sizeof(int) );
477 *(draw_edges_task_args.line) = j;
478 VSs__submit_task(&draw_edges_taskType, &draw_edges_task_args, animSlv);
245 } 479 }
246 return sm; 480 return sm;
247 } 481 }
248 482
249 #pragma omp task inout(*d, *sbe, *release) input (*lastsmb) 483 typedef struct{
250 static void release_ref_list_task(H264Context *h, SuperMBContext *smbc, MBRecContext *d, SliceBufferEntry *sbe, SuperMBTask *lastsmb, int *release){ 484 MBRecContext *d;
485 SliceBufferEntry *sbe;
486 SuperMBTask *lastsmb;
487 int* release;
488 H264Context *h;
489 SuperMBContext *smbc;
490 } release_ref_list_taskArgs;
491
492 int32 release_ref_list_taskArgTypes[6] = {INOUT, INOUT, IN, INOUT, NONCTLD, NONCTLD};
493 int32 release_ref_list_taskArgSizes[6] = {sizeof(MBRecContext), sizeof(SliceBufferEntry), sizeof(SuperMBTask), sizeof(int), sizeof(H264Context), sizeof(SuperMBContext)};
494
495 //#pragma omp task inout(*d, *sbe, *release) input (*lastsmb)
496 static void release_ref_list_task(void *_data, SlaveVP *animatingSlv){
497 release_ref_list_taskArgs* args = (release_ref_list_taskArgs*) _data;
498 MBRecContext *d = args->d;
499 SliceBufferEntry *sbe = args->sbe;
500 SuperMBTask *lastsmb = args->lastsmb;
501 int* releasep = args->release;
502 H264Context *h = args->h;
503 SuperMBContext *smbc = args->smbc;
504
251 H264Slice *s = &sbe->slice; 505 H264Slice *s = &sbe->slice;
252 for (int i=0; i<s->release_cnt; i++){ 506 for (int i=0; i<s->release_cnt; i++){
253 for(int j=0; j<h->max_dpb_cnt; j++){ 507 for(int j=0; j<h->max_dpb_cnt; j++){
254 if(h->dpb[j].cpn== s->release_ref_cpn[i]){ 508 if(h->dpb[j].cpn== s->release_ref_cpn[i]){
255 #pragma omp critical (dpb) 509 //#pragma omp critical (dpb)
510 VSs__start_critical(animatingSlv,0);
256 release_dpb_entry(h, &h->dpb[j], 2); 511 release_dpb_entry(h, &h->dpb[j], 2);
512 VSs__end_critical(animatingSlv,0);
257 break; 513 break;
258 } 514 }
259 } 515 }
260 } 516 }
261 s->release_cnt=0; 517 s->release_cnt=0;
262 518
263 release_smbc(h, smbc); 519 release_smbc(h, smbc);
264 520
265 } 521 VSs__end_task( animatingSlv );
522 }
523
524 VSsTaskType release_ref_list_taskType = {
525 .fn = &release_ref_list_task,
526 .numCtldArgs = 4,
527 .numTotalArgs = 6,
528 .sizeOfArgs = sizeof(release_ref_list_taskArgs),
529 .argTypes = release_ref_list_taskArgTypes,
530 .argSizes = release_ref_list_taskArgSizes};
266 531
267 // static void decode_mb_static_3dwave(H264Context *h, int mb_height, int mb_width, MBRecContext *d, H264Slice *s, H264Mb *mbs, SuperMBTask *smbs, SuperMBTask *smbs_prev){ 532 // static void decode_mb_static_3dwave(H264Context *h, int mb_height, int mb_width, MBRecContext *d, H264Slice *s, H264Mb *mbs, SuperMBTask *smbs, SuperMBTask *smbs_prev){
268 // 533 //
269 // } 534 // }
270 /*-------------------------------------------------------------------------------*/ 535 /*-------------------------------------------------------------------------------*/
271 //end for static 3d wave 536 //end for static 3d wave
272 537
273 #pragma omp task inout (*oc) input(*sbe) 538 typedef struct{
274 static void output_task(H264Context *h, OutputContext *oc, SliceBufferEntry *sbe){ 539 OutputContext *oc;
540 SliceBufferEntry *sbe;
541 H264Context *h;
542 } output_taskArgs;
543
544 int32 output_taskArgTypes[3] = {INOUT, IN, NONCTLD};
545 int32 output_taskArgSizes[3] = {sizeof(OutputContext), sizeof(SliceBufferEntry), sizeof(H264Context)};
546
547 //#pragma omp task inout (*oc) input(*sbe)
548 static void output_task(void *_data, SlaveVP *animatingSlv){
549 output_taskArgs* args = (output_taskArgs*) _data;
550 OutputContext *oc = args->oc;
551 SliceBufferEntry *sbe = args->sbe;
552 H264Context *h = args->h;
553
275 DecodedPicture* out =output_frame(h, oc, sbe->slice.curr_pic, h->ofile, h->frame_width, h->frame_height); 554 DecodedPicture* out =output_frame(h, oc, sbe->slice.curr_pic, h->ofile, h->frame_width, h->frame_height);
276 if (out){ 555 if (out){
277 #pragma omp critical (dpb) 556 //#pragma omp critical (dpb)
557 VSs__start_critical(animatingSlv,0);
278 release_dpb_entry(h, out, 1); 558 release_dpb_entry(h, out, 1);
559 VSs__end_critical(animatingSlv,0);
279 } 560 }
280 print_report(oc->frame_number, oc->video_size, 0, h->verbose); 561 print_report(oc->frame_number, oc->video_size, 0, h->verbose);
281 } 562
563 VSs__end_task( animatingSlv );
564 }
565
566 VSsTaskType output_taskType = {
567 .fn = &output_task,
568 .numCtldArgs = 2,
569 .numTotalArgs = 3,
570 .sizeOfArgs = sizeof(output_taskArgs),
571 .argTypes = output_taskArgTypes,
572 .argSizes = output_taskArgSizes};
282 573
283 /* 574 /*
284 * The following code is the main loop of the file converter 575 * The following code is the main loop of the file converter
285 */ 576 */
286 //Put VMS entry point here 577 //Put VMS entry point here
287 int h264_decode_ompss( H264Context *h) { 578
579 void h264_decode_ompss( void *_params, SlaveVP *animSlv) {
580 H264Context* h = (H264Context*) _params;
581
288 const int bufs = h->pipe_bufs; 582 const int bufs = h->pipe_bufs;
289 583
290 ParserContext *pc; 584 ParserContext *pc;
291 NalContext *nc; 585 NalContext *nc;
292 EntropyContext *ec[bufs]; 586 EntropyContext *ec[bufs];
302 pthread_t sdl_thr; 596 pthread_t sdl_thr;
303 if (h->display){ 597 if (h->display){
304 pthread_create(&sdl_thr, NULL, sdl_thread, h); 598 pthread_create(&sdl_thr, NULL, sdl_thread, h);
305 } 599 }
306 #endif 600 #endif
601 /*sbe= VMS_WL__malloc(sizeof(SliceBufferEntry) * bufs);
602 if (sbe)
603 memset(sbe, 0, sizeof(SliceBufferEntry) * bufs);*/
307 sbe= av_mallocz(sizeof(SliceBufferEntry) * bufs); 604 sbe= av_mallocz(sizeof(SliceBufferEntry) * bufs);
308
309 605
310 pc = get_parse_context(h->ifile); 606 pc = get_parse_context(h->ifile);
311 nc = get_nal_context(h->width, h->height); 607 nc = get_nal_context(h->width, h->height);
312 608
313 for(int i=0; i<bufs; i++){ 609 for(int i=0; i<bufs; i++){
323 av_start_timer(); 619 av_start_timer();
324 int k=0; int init, release; 620 int k=0; int init, release;
325 if (h->static_3d && bufs < h->num_frames ){ 621 if (h->static_3d && bufs < h->num_frames ){
326 int num_pre_ed =0; 622 int num_pre_ed =0;
327 for (num_pre_ed=0; num_pre_ed< bufs -1 && !pc->final_frame; num_pre_ed++){ 623 for (num_pre_ed=0; num_pre_ed< bufs -1 && !pc->final_frame; num_pre_ed++){
328 parse_task( h, pc, nc, &sbe[k%bufs] ); 624 parse_taskArgs parse_task_args;
329 decode_slice_entropy_task(h, ec[k%bufs], &sbe[k%bufs]); 625 parse_task_args.h = h;
330 #pragma omp taskwait on(*pc) 626 parse_task_args.pc = pc;
627 parse_task_args.nc = nc;
628 parse_task_args.sbe = &sbe[k%bufs];
629 VSs__submit_task(&parse_taskType, &parse_task_args, animSlv);
630
631 decode_slice_entropy_taskArgs decode_slice_entropy_task_args;
632 decode_slice_entropy_task_args.h = h;
633 decode_slice_entropy_task_args.ec = ec[k%bufs];
634 decode_slice_entropy_task_args.sbe = &sbe[k%bufs];
635 VSs__submit_task(&decode_slice_entropy_taskType, &decode_slice_entropy_task_args, animSlv);
636 //#pragma omp taskwait on(*pc)
637 VSs__taskwait_on(animSlv,pc);
331 k++; 638 k++;
332 } 639 }
333 640
334 while(!pc->final_frame && frames++ < h->num_frames && !h->quit){ 641 while(!pc->final_frame && frames++ < h->num_frames && !h->quit){
335 parse_task( h, pc, nc, &sbe[k%bufs] ); 642 parse_taskArgs parse_task_args;
336 decode_slice_entropy_task(h, ec[k%bufs], &sbe[k%bufs]); 643 parse_task_args.h = h;
644 parse_task_args.pc = pc;
645 parse_task_args.nc = nc;
646 parse_task_args.sbe = &sbe[k%bufs];
647 VSs__submit_task(&parse_taskType, &parse_task_args, animSlv);
648
649 decode_slice_entropy_taskArgs decode_slice_entropy_task_args;
650 decode_slice_entropy_task_args.h = h;
651 decode_slice_entropy_task_args.ec = ec[k%bufs];
652 decode_slice_entropy_task_args.sbe = &sbe[k%bufs];
653 VSs__submit_task(&decode_slice_entropy_taskType, &decode_slice_entropy_task_args, animSlv);
337 654
338 k++; 655 k++;
339 656
340 init_ref_list_and_get_dpb_task(h, rc[k%2], &sbe[k%bufs], &init); 657 init_ref_list_and_get_dpb_taskArgs init_ref_list_and_get_dpb_task_args;
658 init_ref_list_and_get_dpb_task_args.h = h;
659 init_ref_list_and_get_dpb_task_args.d = rc[k%2];
660 init_ref_list_and_get_dpb_task_args.sbe = &sbe[k%bufs];
661 init_ref_list_and_get_dpb_task_args.init = &init;
662 VSs__submit_task(&init_ref_list_and_get_dpb_taskType, &init_ref_list_and_get_dpb_task_args, animSlv);
663
341 smbc = acquire_smbc(h); 664 smbc = acquire_smbc(h);
342 SuperMBTask *lastsmb= add_decode_slice_3dwave_tasks(rc[k%2], &sbe[k%bufs], smbc); 665 SuperMBTask *lastsmb= add_decode_slice_3dwave_tasks(rc[k%2], &sbe[k%bufs], smbc, animSlv);
343 release_ref_list_task(h, smbc, rc[k%2], &sbe[k%bufs], lastsmb, &release); 666 release_ref_list_taskArgs release_ref_list_task_args;
344 667 release_ref_list_task_args.h = h;
345 output_task (h, oc, &sbe[k%bufs]); 668 release_ref_list_task_args.smbc = smbc;
346 #pragma omp taskwait on(*pc) 669 release_ref_list_task_args.d = rc[k%2];
670 release_ref_list_task_args.sbe = &sbe[k%bufs];
671 release_ref_list_task_args.lastsmb = lastsmb;
672 release_ref_list_task_args.release = &release;
673 VSs__submit_task(&release_ref_list_taskType, &release_ref_list_task_args, animSlv);
674
675 output_taskArgs output_task_args;
676 output_task_args.h = h;
677 output_task_args.oc = oc;
678 output_task_args.sbe = &sbe[k%bufs];
679 VSs__submit_task(&output_taskType, &output_task_args, animSlv);
680 //#pragma omp taskwait on(*pc)
681 VSs__taskwait_on(animSlv,pc);
347 } 682 }
348 683
349 for (int i=0; i< num_pre_ed; i++){ 684 for (int i=0; i< num_pre_ed; i++){
350 k++; 685 k++;
351 init_ref_list_and_get_dpb_task(h, rc[k%2], &sbe[k%bufs], &init); 686 init_ref_list_and_get_dpb_taskArgs init_ref_list_and_get_dpb_task_args;
687 init_ref_list_and_get_dpb_task_args.h = h;
688 init_ref_list_and_get_dpb_task_args.d = rc[k%2];
689 init_ref_list_and_get_dpb_task_args.sbe = &sbe[k%bufs];
690 init_ref_list_and_get_dpb_task_args.init = &init;
691 VSs__submit_task(&init_ref_list_and_get_dpb_taskType, &init_ref_list_and_get_dpb_task_args, animSlv);
352 smbc = acquire_smbc(h); 692 smbc = acquire_smbc(h);
353 SuperMBTask *lastsmb= add_decode_slice_3dwave_tasks(rc[k%2], &sbe[k%bufs], smbc); 693 SuperMBTask *lastsmb= add_decode_slice_3dwave_tasks(rc[k%2], &sbe[k%bufs], smbc, animSlv);
354 release_ref_list_task(h, smbc, rc[k%2], &sbe[k%bufs], lastsmb, &release); 694 release_ref_list_taskArgs release_ref_list_task_args;
355 695 release_ref_list_task_args.h = h;
356 output_task (h, oc, &sbe[k%bufs]); 696 release_ref_list_task_args.smbc = smbc;
697 release_ref_list_task_args.d = rc[k%2];
698 release_ref_list_task_args.sbe = &sbe[k%bufs];
699 release_ref_list_task_args.lastsmb = lastsmb;
700 release_ref_list_task_args.release = &release;
701 VSs__submit_task(&release_ref_list_taskType, &release_ref_list_task_args, animSlv);
702
703 output_taskArgs output_task_args;
704 output_task_args.h = h;
705 output_task_args.oc = oc;
706 output_task_args.sbe = &sbe[k%bufs];
707 VSs__submit_task(&output_taskType, &output_task_args, animSlv);
357 } 708 }
358 709
359 } else { 710 } else {
360 while(!pc->final_frame && frames++ < h->num_frames && !h->quit){ 711 while(!pc->final_frame && frames++ < h->num_frames && !h->quit){
361 parse_task( h, pc, nc, &sbe[k%bufs] ); 712 int32* taskID;
362 713 taskID = VSs__create_taskID_of_size(1,animSlv );
363 decode_slice_entropy_task(h, ec[k%bufs], &sbe[k%bufs]); 714 taskID[1] = frames*10+1;
364 715 parse_taskArgs parse_task_args;
365 decode_slice_mb_task(h, rc[0], &sbe[k%bufs]); 716 parse_task_args.h = h;
366 717 parse_task_args.pc = pc;
367 output_task (h, oc, &sbe[k%bufs]); 718 parse_task_args.nc = nc;
368 #pragma omp taskwait on(*pc) 719 parse_task_args.sbe = &sbe[k%bufs];
720 VSs__submit_task_with_ID(&parse_taskType, &parse_task_args, taskID, animSlv);
721
722 taskID = VSs__create_taskID_of_size(1,animSlv );
723 taskID[1] = frames*10+2;
724 decode_slice_entropy_taskArgs decode_slice_entropy_task_args;
725 decode_slice_entropy_task_args.h = h;
726 decode_slice_entropy_task_args.ec = ec[k%bufs];
727 decode_slice_entropy_task_args.sbe = &sbe[k%bufs];
728 VSs__submit_task_with_ID(&decode_slice_entropy_taskType, &decode_slice_entropy_task_args,taskID, animSlv);
729
730 taskID = VSs__create_taskID_of_size(1,animSlv );
731 taskID[1] = frames*10+3;
732 decode_slice_mb_taskArgs decode_slice_mb_task_args;
733 decode_slice_mb_task_args.h = h;
734 decode_slice_mb_task_args.d = rc[0];
735 decode_slice_mb_task_args.sbe = &sbe[k%bufs];
736 VSs__submit_task_with_ID(&decode_slice_mb_taskType, &decode_slice_mb_task_args,taskID, animSlv);
737
738 taskID = VSs__create_taskID_of_size(1,animSlv );
739 taskID[1] = frames*10+4;
740 output_taskArgs output_task_args;
741 output_task_args.h = h;
742 output_task_args.oc = oc;
743 output_task_args.sbe = &sbe[k%bufs];
744 VSs__submit_task_with_ID(&output_taskType, &output_task_args,taskID, animSlv);
745 //#pragma omp taskwait on(*pc)
746 VSs__taskwait_on(animSlv,pc);
369 k++; 747 k++;
370 } 748 }
371 } 749 }
372 #pragma omp taskwait 750 //#pragma omp taskwait
373 751 VSs__taskwait(animSlv);
752
374 while ((out=output_frame(h, oc, NULL, h->ofile, h->frame_width, h->frame_height))) ; 753 while ((out=output_frame(h, oc, NULL, h->ofile, h->frame_width, h->frame_height))) ;
375 754
376 print_report(oc->frame_number, oc->video_size, 1, h->verbose); 755 print_report(oc->frame_number, oc->video_size, 1, h->verbose);
377 h->num_frames = oc->frame_number; 756 h->num_frames = oc->frame_number;
378 /* finished ! */ 757 /* finished ! */
395 signal_sdl_exit(h); 774 signal_sdl_exit(h);
396 pthread_join(sdl_thr, NULL); 775 pthread_join(sdl_thr, NULL);
397 } 776 }
398 #endif 777 #endif
399 778
400 return 0; 779 VSs__end_thread( animSlv );
401 } 780 }