Subversion Repositories Kolibri OS

Rev

Rev 2693 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1696 serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
2415 Serge 6
#include "system.h"
7
#include "../winlib/winlib.h"
2427 Serge 8
#include "sound.h"
2349 Serge 9
#include "fplay.h"
1696 serge 10
#include 
3068 serge 11
1696 serge 12
 
2427 Serge 13
extern int res_pause_btn_pressed[];
14
15
 
16
extern int res_play_btn_pressed[];
17
18
 
2693 Serge 19
extern volatile int sound_level_0;
3068 serge 20
extern volatile int sound_level_1;
21
2427 Serge 22
 
1696 serge 23
{
24
    AVPicture      picture;
2349 Serge 25
    double         pts;
1696 serge 26
    volatile int   ready;
27
}vframe_t;
28
29
 
2349 Serge 30
volatile int      frames_count = 0;
3068 serge 31
1696 serge 32
 
2349 Serge 33
1696 serge 34
 
35
int dfx    = 0;
36
37
 
2415 Serge 38
2349 Serge 39
 
1696 serge 40
int height;
41
42
 
43
AVFrame  *Frame;
44
45
 
2349 Serge 46
47
 
48
49
 
2693 Serge 50
{
51
    int i;
52
2349 Serge 53
 
2693 Serge 54
    {
3068 serge 55
        frames[i].pts    = 0;
2693 Serge 56
        frames[i].ready  = 0;
57
    };
58
    frames_count = 0;
3068 serge 59
    vfx    = 0;
2693 Serge 60
    dfx    = 0;
61
};
62
63
 
1696 serge 64
{
65
    int        i;
66
67
 
68
    height = ctx->height;
69
70
 
3068 serge 71
2421 Serge 72
 
2415 Serge 73
2349 Serge 74
 
2415 Serge 75
                           ctx->pix_fmt, HW_BIT_BLIT|HW_TEX_BLIT);
2349 Serge 76
    if( main_render == NULL)
2415 Serge 77
    {
2349 Serge 78
        printf("Cannot create render\n\r");
79
        return 0;
80
    };
81
82
 
1696 serge 83
    if ( Frame == NULL )
84
    {
85
        printf("Cannot alloc video frame\n\r");
2349 Serge 86
        return 0;
1696 serge 87
    };
88
89
 
2349 Serge 90
    {
1696 serge 91
        int ret;
2349 Serge 92
1696 serge 93
 
2349 Serge 94
//                   ctx->width, ctx->height, ctx->pix_fmt );
95
1696 serge 96
 
2349 Serge 97
                               ctx->width, ctx->height);
98
        if ( ret != 0 )
99
        {
1696 serge 100
            printf("Cannot alloc video buffer\n\r");
2349 Serge 101
            return 0;
102
        };
103
1696 serge 104
 
2349 Serge 105
        frames[i].ready  = 0;
106
    };
1696 serge 107
108
 
2349 Serge 109
1696 serge 110
 
2349 Serge 111
    return 1;
1696 serge 112
};
113
114
 
2349 Serge 115
{
1696 serge 116
    AVPacket   pkt;
2349 Serge 117
    double     pts;
1696 serge 118
    int frameFinished;
2415 Serge 119
    double current_clock;
2427 Serge 120
1696 serge 121
 
2349 Serge 122
        return -1;
3068 serge 123
1696 serge 124
 
2349 Serge 125
        return 0;
126
1696 serge 127
 
3068 serge 128
    current_clock = -90.0 + get_master_clock();
2693 Serge 129
1696 serge 130
 
2427 Serge 131
        Frame->reordered_opaque != AV_NOPTS_VALUE)
132
        pts = Frame->reordered_opaque;
2693 Serge 133
    else if(pkt.dts != AV_NOPTS_VALUE)
134
        pts= pkt.dts;
2427 Serge 135
    else
136
        pts= 0;
137
3068 serge 138
 
139
 
2427 Serge 140
*/
3068 serge 141
    if( 1 /*pts > current_clock*/)
2693 Serge 142
    {
1696 serge 143
        frameFinished = 0;
2427 Serge 144
1696 serge 145
 
2427 Serge 146
1696 serge 147
 
2427 Serge 148
            printf("video decoder error\n");
149
1696 serge 150
 
2427 Serge 151
        {
152
            AVPicture *dst_pic;
153
154
 
155
                Frame->reordered_opaque != AV_NOPTS_VALUE)
156
                pts = Frame->reordered_opaque;
2693 Serge 157
            else if(pkt.dts != AV_NOPTS_VALUE)
2427 Serge 158
                pts= pkt.dts;
159
            else
160
                pts= 0;
161
162
 
2349 Serge 163
//                                Frame, "best_effort_timestamp");
164
1696 serge 165
 
2349 Serge 166
//            pts = 0;
167
1696 serge 168
 
2427 Serge 169
2349 Serge 170
 
2427 Serge 171
2349 Serge 172
 
2427 Serge 173
                      (const uint8_t**)Frame->data,
2415 Serge 174
                      Frame->linesize, ctx->pix_fmt, ctx->width, ctx->height);
2349 Serge 175
176
 
2427 Serge 177
//            printf("pts %f\n", frames[dfx].pts);
2693 Serge 178
179
 
2427 Serge 180
1696 serge 181
 
2427 Serge 182
            dfx&= 3;
183
            frames_count++;
3068 serge 184
        };
2427 Serge 185
    };
1696 serge 186
    av_free_packet(&pkt);
2349 Serge 187
1696 serge 188
 
2349 Serge 189
}
1696 serge 190
191
 
2427 Serge 192
extern volatile enum player_state decoder_state;
3068 serge 193
extern volatile enum player_state sound_state;
194
195
 
2427 Serge 196
1696 serge 197
 
2693 Serge 198
2415 Serge 199
 
3068 serge 200
{
201
    window_t  *win;
202
203
 
204
205
 
206
207
 
208
    win->panel.play_btn->img_hilite     = res_play_btn;
209
    win->panel.play_btn->img_pressed    = res_play_btn_pressed;
210
    win->panel.prg->current             = rewind_pos;
211
212
 
213
    player_state = STOP;
214
    decoder_state = PLAY_2_STOP;
215
    sound_state = PLAY_2_STOP;
216
    render_draw_client(main_render);
217
//    printf("stop player\n");
218
219
 
220
221
 
2415 Serge 222
{
1696 serge 223
    window_t  *win;
2415 Serge 224
1696 serge 225
 
2415 Serge 226
1696 serge 227
 
2415 Serge 228
    {
1696 serge 229
        case MSG_SIZE:
2415 Serge 230
            //printf("MSG_SIZE\n");
231
            render_adjust_size(main_render, win);
232
            break;
1696 serge 233
234
 
2415 Serge 235
            render_draw_client(main_render);
236
            break;
1696 serge 237
238
 
2427 Serge 239
3068 serge 240
 
2427 Serge 241
            {
242
                win->panel.play_btn->img_default = res_pause_btn;
2693 Serge 243
                win->panel.play_btn->img_hilite  = res_pause_btn;
244
                win->panel.play_btn->img_pressed = res_pause_btn_pressed;
245
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
3068 serge 246
                player_state = PLAY;
247
                sound_state  = PAUSE_2_PLAY;
248
2427 Serge 249
 
250
            else if(player_state == PLAY)
251
            {
252
                win->panel.play_btn->img_default = res_play_btn;
2693 Serge 253
                win->panel.play_btn->img_hilite  = res_play_btn;
254
                win->panel.play_btn->img_pressed = res_play_btn_pressed;
255
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
3068 serge 256
                player_state = PAUSE;
2427 Serge 257
                sound_state  = PLAY_2_PAUSE;
3068 serge 258
            }
2427 Serge 259
            break;
260
261
 
2415 Serge 262
            switch((short)arg1)
263
            {
264
                case ID_PLAY:
2427 Serge 265
                    if(player_state == PAUSE)
266
                    {
267
                        win->panel.play_btn->img_default  = res_pause_btn;
2693 Serge 268
                        win->panel.play_btn->img_hilite   = res_pause_btn;
269
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
270
                        player_state = PLAY;
3068 serge 271
                        sound_state = PAUSE_2_PLAY;
272
                    }
2693 Serge 273
                    else if(player_state == PLAY)
274
                    {
275
                        win->panel.play_btn->img_default = res_play_btn;
2427 Serge 276
                        win->panel.play_btn->img_hilite  = res_play_btn;
277
                        win->panel.play_btn->img_pressed  = res_play_btn_pressed;
278
                        player_state = PAUSE;
279
                        sound_state  = PLAY_2_PAUSE;
3068 serge 280
                    }
2427 Serge 281
                    else if(player_state == STOP)
3068 serge 282
                    {
283
                        win->panel.play_btn->img_default  = res_pause_btn;
284
                        win->panel.play_btn->img_hilite   = res_pause_btn;
285
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
286
                        rewind_pos = 0;
287
                        send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
288
                        player_state = PLAY;
289
                        decoder_state = PREPARE;
290
                    }
291
                    break;
2427 Serge 292
2693 Serge 293
 
3068 serge 294
                    player_stop();
295
                    break;
296
297
 
298
                    if(player_state != REWIND)
2693 Serge 299
                    {
300
                        progress_t *prg = (progress_t*)arg2;
301
3068 serge 302
 
303
304
 
305
                        player_state  = REWIND;
306
                        decoder_state = REWIND;
307
                        sound_state   = PLAY_2_STOP;
308
                        if(rewind_pos < prg->current)
309
                        {
310
                            prg->current  = rewind_pos;
311
                            rewind_pos = -rewind_pos;
312
                        }
313
                        else
314
                            prg->current  = rewind_pos;
315
316
 
317
                        win->panel.play_btn->img_hilite   = res_pause_btn;
318
                        win->panel.play_btn->img_pressed  = res_pause_btn_pressed;
319
                        send_message(&prg->ctrl, MSG_PAINT, 0, 0);
320
                    };
2693 Serge 321
                    break;
322
3068 serge 323
 
324
                {
325
                    slider_t *sld = (slider_t*)arg2;
326
                    int      peak;
327
                    int      level;
328
329
 
330
//                    level = (log2(peak+16384)*10000.0)/15 - 10000;
331
                    level =  peak;
332
333
 
334
                    set_audio_volume(level, level);
335
                    send_message(&sld->ctrl, MSG_PAINT, 0, 0);
336
                    win->panel.lvl->vol = level;
337
                }
338
339
 
2427 Serge 340
                    break;
341
            }
342
            break;
2415 Serge 343
1696 serge 344
 
2415 Serge 345
            def_window_proc(ctrl,msg,arg1,arg2);
346
    };
347
    return 0;
348
};
349
1696 serge 350
 
2693 Serge 351
352
 
2415 Serge 353
{
1696 serge 354
    progress_t  *prg = main_render->win->panel.prg;
3068 serge 355
    level_t     *lvl = main_render->win->panel.lvl;
356
1696 serge 357
 
3068 serge 358
    double      fdelay;           /*    milliseconds    */
359
360
 
2427 Serge 361
362
 
363
    {
2415 Serge 364
        render->win->win_command = WIN_CLOSED;
365
        return;
366
    }
2427 Serge 367
    else if(player_state == REWIND)
3068 serge 368
    {
369
        yield();
370
        return;
371
    }
372
    else if (decoder_state == STOP && frames_count  == 0 &&
373
              player_state  != STOP)
374
    {
375
        player_stop();
376
    }
377
    else if(player_state != PLAY)
2427 Serge 378
    {
379
        yield();
380
        return;
381
    };
2415 Serge 382
1696 serge 383
 
3068 serge 384
 
2693 Serge 385
    if(frames[vfx].ready == 1 )
2415 Serge 386
    {
1696 serge 387
        int sys_time;
2693 Serge 388
389
 
2415 Serge 390
        fdelay = (frames[vfx].pts - ctime);
391
1696 serge 392
 
2427 Serge 393
//                frames[vfx].pts, ctime, fdelay);
2693 Serge 394
2349 Serge 395
 
2693 Serge 396
        {
2415 Serge 397
            delay(1);
2693 Serge 398
//            yield();
2427 Serge 399
            return;
2421 Serge 400
        };
1696 serge 401
2415 Serge 402
 
2693 Serge 403
        fdelay = (frames[vfx].pts - ctime);
404
405
 
406
407
 
408
//            printf("systime %d pts %f time %f delay %f\n",
409
//                    sys_time*10, frames[vfx].pts, ctime, fdelay);
410
411
 
2415 Serge 412
        prg->current = frames[vfx].pts*1000;
3068 serge 413
//        printf("current %f\n", prg->current);
414
        lvl->current = vfx & 1 ? sound_level_1 : sound_level_0;
415
416
 
417
418
 
419
            send_message(&lvl->ctrl, MSG_PAINT, 0, 0);
420
421
 
422
        frames[vfx].ready = 0;
2415 Serge 423
        vfx++;
424
        vfx&= 3;
425
    }
2427 Serge 426
    else yield();
427
428
 
2693 Serge 429
430
 
431
    {
432
        ctime = get_master_clock();
433
        fdelay = (frames[vfx].pts - ctime);
434
435
 
436
//                    frames[vfx].pts, ctime, fdelay);
437
438
 
439
        {
440
            int  next_vfx;
441
            fdelay = 0;
442
            next_vfx = (vfx+1) & 3;
443
            if( frames[next_vfx].ready == 1 )
444
            {
445
                if(frames[next_vfx].pts <= ctime)
446
                {
447
                    frames[vfx].ready = 0;                  // skip this frame
448
                    vfx++;
449
                    vfx&= 3;
450
                }
451
                else
452
                {
453
                    if( (frames[next_vfx].pts - ctime) <
454
                        ( ctime - frames[vfx].pts) )
455
                    {
456
                        frames[vfx].ready = 0;                  // skip this frame
457
                        vfx++;
458
                        vfx&= 3;
459
                        fdelay = (frames[next_vfx].pts - ctime);
460
                    }
461
                }
462
            };
463
        };
464
465
 
466
        {
467
           int val = fdelay;
468
           printf("pts %f time %f delay %d\n",
469
                   frames[vfx].pts, ctime, val);
470
           delay(val/10);
471
        };
472
473
 
474
        fdelay = (frames[vfx].pts - ctime);
475
476
 
477
                frames[vfx].pts, ctime, fdelay);
478
479
 
480
        main_render->win->panel.prg->current = frames[vfx].pts;
481
//        send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0);
482
        frames[vfx].ready = 0;
483
        vfx++;
484
        vfx&= 3;
485
    }
486
    else yield();
487
#endif
488
489
 
2415 Serge 490
491
 
2427 Serge 492
 
2415 Serge 493
494
 
495
{
496
    window_t    *MainWindow;
497
498
 
499
500
 
501
                               10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
3068 serge 502
2415 Serge 503
 
2693 Serge 504
//    printf("MainWindow %x\n", MainWindow);
2415 Serge 505
506
 
507
508
 
509
2693 Serge 510
 
511
    player_state = PLAY;
3068 serge 512
2693 Serge 513
 
2415 Serge 514
515
 
3068 serge 516
517
 
2427 Serge 518
    return 0;
2349 Serge 519
};
1696 serge 520
521
 
2349 Serge 522
 
523
void draw_sw_picture(render_t *render, AVPicture *picture);
524
525
 
526
                        uint32_t ctx_format, uint32_t flags)
527
{
528
    render_t *render;
2415 Serge 529
2349 Serge 530
 
2415 Serge 531
2349 Serge 532
 
2415 Serge 533
    memset(render, 0, sizeof(render_t));
534
535
 
2349 Serge 536
    render->ctx_height = height;
537
    render->ctx_format = ctx_format;
538
539
 
540
    render->caps = InitPixlib(flags);
541
    mutex_unlock(&driver_lock);
542
543
 
544
    {
545
        printf("FPlay render engine: Hardware acceleration disabled\n");
546
        render->draw = draw_sw_picture;
547
    }
548
    else
549
    {
550
        render->target = 0;
551
        render->draw   = draw_hw_picture;
552
    };
553
554
 
555
    return render;
556
};
557
558
 
559
{
560
    int i;
561
562
 
2415 Serge 563
    render->rcvideo.l = 0;
564
    render->rcvideo.t = 0;
565
    render->rcvideo.r = width;
566
    render->rcvideo.b = height;
567
2349 Serge 568
 
3068 serge 569
570
 
2415 Serge 571
    {
572
        int yoffs;
573
        yoffs = (render->win_height-height)/2;
574
        if(yoffs)
575
        {
576
            render->rctop.t = 0;
577
            render->rctop.b = yoffs;
578
            render->rcvideo.t  = yoffs;
579
            render->layout |= HAS_TOP;
580
        }
581
2349 Serge 582
 
2415 Serge 583
        if(yoffs)
584
        {
585
            render->rcbottom.t = render->rcvideo.t+render->rcvideo.b;
586
            render->rcbottom.b = yoffs;
587
            render->layout |= HAS_BOTTOM;
588
        }
589
    }
590
591
 
592
    {
593
        int xoffs;
594
        xoffs = (render->win_width-width)/2;
595
        if(xoffs)
596
        {
597
            render->rcleft.r  = xoffs;
598
            render->rcvideo.l = xoffs;
599
            render->layout |= HAS_LEFT;
600
        }
601
        xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r);
602
        if(xoffs)
603
        {
604
            render->rcright.l = render->rcvideo.l+render->rcvideo.r;
605
            render->rcright.r = xoffs;
606
            render->layout |= HAS_RIGHT;
607
        }
608
    };
609
610
 
2349 Serge 611
    {
612
        if(render->caps & HW_TEX_BLIT)
613
        {
614
            for( i=0; i < 4; i++)
615
            {
616
                render->bitmap[i].width  = render->ctx_width;
617
                render->bitmap[i].height = render->ctx_height;
618
619
 
620
                {
621
                    player_state = CLOSED;
2427 Serge 622
/*
2349 Serge 623
 *  Epic fail. Need  exit_thread() here
624
 *
625
*/
626
                    return 0;
627
                };
628
            }
629
        }
630
        else
631
        {
632
            render->bitmap[0].width  = width;
633
            render->bitmap[0].height = height;
634
635
 
636
                return 0;
637
        };
638
        render->state = INIT;
639
        return 0;
640
    };
641
642
 
643
        return 0;
644
645
 
646
    render->bitmap[0].height = height;
647
    resize_bitmap(&render->bitmap[0]);
648
649
 
650
};
651
652
 
2415 Serge 653
{
2349 Serge 654
    uint32_t right, bottom, new_w, new_h;
655
    uint32_t s, sw, sh;
656
    uint8_t  state;
657
658
 
3068 serge 659
    bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
660
2349 Serge 661
 
3068 serge 662
 //                   right, bottom);
663
664
 
2415 Serge 665
2349 Serge 666
 
2415 Serge 667
        return;
2349 Serge 668
2415 Serge 669
 
670
        return;
2349 Serge 671
672
 
673
        bottom == render->win_height)
674
        return;
675
676
 
677
    new_h = right*render->ctx_height/render->ctx_width;
678
679
 
3068 serge 680
    {
681
        new_w = right;
2349 Serge 682
        new_h = right*render->ctx_height/render->ctx_width;
3068 serge 683
    };
684
    if(new_h > bottom)
685
    {
2349 Serge 686
        new_h = bottom;
3068 serge 687
        new_w = bottom*render->ctx_width/render->ctx_height;
688
    };
2349 Serge 689
2415 Serge 690
 
691
    render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
3068 serge 692
    render_set_size(render, new_w, new_h);
2349 Serge 693
};
694
695
 
696
{
697
    int      dst_width, dst_height;
698
    bitmap_t   *bitmap;
2415 Serge 699
    uint8_t    *data[4];
700
    int      linesize[4];
2349 Serge 701
    int ret;
2415 Serge 702
2349 Serge 703
 
2427 Serge 704
       render->win_state == ROLLED)
705
        return;
2349 Serge 706
707
 
708
    {
709
        dst_width  = render->ctx_width;
710
        dst_height = render->ctx_height;
711
    }
712
    else
713
    {
714
        dst_width  = render->rcvideo.r;
3068 serge 715
        dst_height = render->rcvideo.b;
716
    };
2349 Serge 717
718
 
719
              render->ctx_width, render->ctx_height, render->ctx_format,
720
              dst_width, dst_height, PIX_FMT_BGRA,
721
              SWS_FAST_BILINEAR, NULL, NULL, NULL);
722
    if(cvt_ctx == NULL)
723
    {
724
        printf("Cannot initialize the conversion context!\n");
725
        return ;
726
    };
727
2415 Serge 728
 
729
730
 
731
    if( ret != 0)
732
    {
733
        printf("Cannot lock bitmap!\n");
3068 serge 734
        return ;
2415 Serge 735
    }
736
737
 
2349 Serge 738
    data[0] = bitmap->data;
2415 Serge 739
    data[1] = bitmap->data+1;
740
    data[2] = bitmap->data+2;
741
    data[3] = bitmap->data+3;
742
2349 Serge 743
 
2415 Serge 744
    linesize[1] = bitmap->pitch;
745
    linesize[2] = bitmap->pitch;
746
    linesize[3] = bitmap->pitch;
747
2349 Serge 748
 
749
              picture->linesize, 0, render->ctx_height, data, linesize);
750
//    printf("sws_scale\n");
751
752
 
2415 Serge 753
                 CAPTION_HEIGHT+render->rcvideo.t,
2421 Serge 754
                 render->rcvideo.r, render->rcvideo.b);
2415 Serge 755
3068 serge 756
 
2427 Serge 757
//    printf("blit_bitmap\n");
2349 Serge 758
759
 
2415 Serge 760
 
3068 serge 761
//    render->target&= 3;
762
}
2349 Serge 763
764
 
765
{
766
    uint8_t     *data[4];
767
    int      linesize[4];
768
769
 
2415 Serge 770
       render->win_state == ROLLED)
771
        return;
2349 Serge 772
773
 
774
              render->ctx_width, render->ctx_height,
775
              render->ctx_format,
776
              render->rcvideo.r, render->rcvideo.b,
2415 Serge 777
              PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
2349 Serge 778
    if(cvt_ctx == NULL)
779
    {
780
        printf("Cannot initialize the conversion context!\n");
781
        return ;
782
    }
783
784
 
785
    data[1] = render->bitmap[0].data+1;
786
    data[2] = render->bitmap[0].data+2;
787
    data[3] = render->bitmap[0].data+3;
788
789
 
790
 
791
    linesize[1] = render->bitmap[0].pitch;
792
    linesize[2] = render->bitmap[0].pitch;
793
    linesize[3] = render->bitmap[0].pitch;
794
795
 
796
              picture->linesize, 0, render->ctx_height, data, linesize);
797
798
 
2415 Serge 799
                render->rcvideo.t+CAPTION_HEIGHT,
2421 Serge 800
                render->rcvideo.r, render->rcvideo.b);
2415 Serge 801
    render->last_bitmap = &render->bitmap[0];
2427 Serge 802
}
2349 Serge 803
804
 
2415 Serge 805
{
806
    if(render->win_state == MINIMIZED ||
807
       render->win_state == ROLLED)
808
        return;
809
2349 Serge 810
 
3068 serge 811
    {
2427 Serge 812
         if(frames[vfx].ready == 1 )
2693 Serge 813
            main_render->draw(main_render, &frames[vfx].picture);
814
         else
815
            draw_bar(0, CAPTION_HEIGHT, render->win_width,
816
                 render->rcvideo.b, 0);
817
    }
3068 serge 818
    else if( player_state == STOP )
819
    {
820
        draw_bar(0, CAPTION_HEIGHT, render->win_width,
821
                 render->rcvideo.b, 0);
822
    };
2427 Serge 823
824
 
2415 Serge 825
        draw_bar(0, CAPTION_HEIGHT, render->win_width,
2421 Serge 826
                 render->rctop.b, 0);
2415 Serge 827
    if(render->layout & HAS_LEFT)
828
        draw_bar(0, render->rcvideo.t+CAPTION_HEIGHT, render->rcleft.r,
2421 Serge 829
                 render->rcvideo.b, 0);
2415 Serge 830
    if(render->layout & HAS_RIGHT)
831
        draw_bar(render->rcright.l, render->rcvideo.t+CAPTION_HEIGHT,
2421 Serge 832
                 render->rcright.r, render->rcvideo.b, 0);
2415 Serge 833
    if(render->layout & HAS_BOTTOM)
834
        draw_bar(0, render->rcbottom.t+CAPTION_HEIGHT,
2421 Serge 835
                 render->win_width, render->rcbottom.b, 0);
2415 Serge 836
}
837
>
2349 Serge 838