Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4438 Serge 1
 
2
3
 
4
#include 
5
#include 
6
#include 
7
8
 
9
#include 
10
#include 
11
#include 
12
#include 
13
#include "winlib/winlib.h"
5021 Serge 14
4438 Serge 15
 
16
#include "fplay.h"
17
18
 
6118 serge 19
int va_check_codec_support(enum AVCodecID id);
20
#endif
21
22
 
4438 Serge 23
volatile enum player_state decoder_state = PREPARE;
24
volatile enum player_state sound_state   = STOP;
25
26
 
27
28
 
29
 
6121 serge 30
4438 Serge 31
 
6121 serge 32
4438 Serge 33
 
6121 serge 34
extern int resampler_size;
4438 Serge 35
36
 
37
char *movie_file;
38
39
 
6118 serge 40
4438 Serge 41
 
6117 serge 42
 
4438 Serge 43
44
 
45
46
 
5603 serge 47
48
 
4438 Serge 49
50
 
6117 serge 51
 
52
{
4438 Serge 53
    return (double)av_q2d(vst->fCtx->streams[vst->aStream]->time_base)*1000;
6117 serge 54
};
4438 Serge 55
56
 
57
 
58
{
59
    static vst_t vst;
6117 serge 60
    int i, ret;
61
    char *file_name, *dot;
4438 Serge 62
63
 
64
    {
65
        movie_file = get_moviefile();
66
        if(movie_file == NULL)
67
        {
68
            printf("Please provide a movie file\n");
69
            return -1;
70
        }
71
    }
72
    else movie_file = argv[1];
73
74
 
75
76
 
77
78
 
79
    avdevice_register_all();
80
    av_register_all();
81
82
 
6117 serge 83
    {
4438 Serge 84
        printf("Cannot open file %s\n\r", movie_file);
85
        return -1; // Couldn't open file
86
    };
87
88
 
6117 serge 89
4438 Serge 90
 
91
    if(avformat_find_stream_info(vst.fCtx, NULL) < 0)
6117 serge 92
    {
4438 Serge 93
        printf("Cannot find streams\n\r");
94
        return -1;
95
    };
96
97
 
98
    dot = strrchr(file_name,'.');
99
    if(dot)
100
    {
101
        movie_file = malloc(dot-file_name+1);
102
        memcpy(movie_file, file_name, dot-file_name);
103
        movie_file[dot-file_name] = 0;
104
    }
105
    else movie_file = file_name;
106
107
 
6117 serge 108
4438 Serge 109
 
110
    vst.vStream = -1;
6117 serge 111
    vst.aStream = -1;
112
113
 
114
    {
4438 Serge 115
        if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO
6117 serge 116
            && vst.vStream < 0)
117
        {
4438 Serge 118
            vst.vStream = i;
6117 serge 119
            video_time_base = vst.fCtx->streams[i]->time_base;
120
            if(stream_duration == 0)
4438 Serge 121
               stream_duration = vst.fCtx->streams[i]->duration;
6117 serge 122
        }
123
4438 Serge 124
 
6117 serge 125
           vst.aStream < 0)
126
        {
4438 Serge 127
            vst.aStream = i;
6117 serge 128
            if(stream_duration == 0)
4438 Serge 129
               stream_duration = vst.fCtx->streams[i]->duration;
6117 serge 130
        }
4438 Serge 131
    }
132
133
 
6117 serge 134
    {
4438 Serge 135
        printf("Video stream not detected\n\r");
136
        return -1; // Didn't find a video stream
137
    };
138
139
 
140
141
 
142
    vst.vCtx = vst.fCtx->streams[vst.vStream]->codec;
6117 serge 143
    vst.aCtx = vst.fCtx->streams[vst.aStream]->codec;
144
4438 Serge 145
 
6117 serge 146
    printf("codec id %x name %s\n",vst.vCtx->codec_id, vst.vCodec->name);
147
    printf("ctx->pix_fmt %d\n", vst.vCtx->pix_fmt);
148
4438 Serge 149
 
6117 serge 150
    {
151
        printf("Unsupported codec with id %d for input stream %d\n",
4438 Serge 152
        vst.vCtx->codec_id, vst.vStream);
6117 serge 153
        return -1; // Codec not found
4438 Serge 154
    }
155
156
 
6121 serge 157
        return -1;
158
6117 serge 159
 
160
    {
4438 Serge 161
        printf("Error while opening codec for input stream %d\n",
162
                vst.vStream);
6117 serge 163
        return -1; // Could not open codec
4438 Serge 164
    };
165
166
 
6121 serge 167
4438 Serge 168
 
6117 serge 169
    mutex_init(&vst.q_audio.lock);
170
    mutex_init(&vst.gpu_lock);
171
4438 Serge 172
 
6117 serge 173
        vst.aCtx->request_channels = FFMIN(2, vst.aCtx->channels);
174
    else
4438 Serge 175
        vst.aCtx->request_channels = 2;
6117 serge 176
4438 Serge 177
 
6117 serge 178
4438 Serge 179
 
6117 serge 180
    {
4438 Serge 181
        if(avcodec_open2(vst.aCtx, vst.aCodec, NULL) >= 0 )
6117 serge 182
        {
4438 Serge 183
            WAVEHEADER       whdr;
184
            int fmt;
185
            int channels;
186
187
 
188
            vst.aCtx->sample_rate, vst.aCtx->channels, vst.aCtx->sample_fmt );
6117 serge 189
            whdr.riff_id = 0x46464952;
4438 Serge 190
            whdr.riff_format = 0x45564157;
191
            whdr.wFormatTag = 0x01;
192
            whdr.nSamplesPerSec = vst.aCtx->sample_rate;
6117 serge 193
            whdr.nChannels = 2;
4438 Serge 194
            whdr.wBitsPerSample = 16;
195
196
 
6117 serge 197
4438 Serge 198
 
199
200
 
201
            {
202
                decoder_buffer = (uint8_t*)av_mallocz(192000*2+64);
203
                if( decoder_buffer != NULL )
204
                {
205
                    mutex_init(&astream.lock);
5603 serge 206
                    astream.count  = 0;
4438 Serge 207
                    astream.buffer = (char *)av_mallocz(192000*3);
208
                    if( astream.buffer != NULL )
209
                        have_sound = 1;
210
                    else
211
                        av_free(decoder_buffer);
212
                }
213
                if( have_sound == 0)
214
                {
215
                        printf("Not enough memory for audio buffers\n");
216
                }
217
            }
218
        }
219
        else printf("Cannot open audio codec\n\r");
220
    }
221
    else printf("Unsupported audio codec!\n");
222
223
 
6117 serge 224
        return 0;
4438 Serge 225
226
 
6117 serge 227
4438 Serge 228
 
229
    av_free(pFrame);
230
231
 
232
 
233
234
 
5603 serge 235
           (AUDIO_THREAD | VIDEO_THREAD))
236
           delay(1);
237
4438 Serge 238
 
5603 serge 239
        mutex_destroy(&astream.lock);
240
4438 Serge 241
 
6117 serge 242
    mutex_destroy(&vst.q_audio.lock);
243
4438 Serge 244
 
245
}
246
247
 
248
 
6117 serge 249
{
4438 Serge 250
    AVPacket  packet;
251
    int err;
252
253
 
6117 serge 254
    if( err == 0)
4438 Serge 255
    {
256
        if(packet.stream_index == vst->vStream)
6117 serge 257
            put_packet(&vst->q_video, &packet);
258
        else if( (packet.stream_index == vst->aStream) &&
259
                  (have_sound != 0) )
4438 Serge 260
        {
261
            put_packet(&vst->q_audio, &packet);
6117 serge 262
            if(audio_base == -1.0)
4438 Serge 263
            {
264
                if (packet.pts != AV_NOPTS_VALUE)
265
                    audio_base = get_audio_base(vst) * packet.pts;
6117 serge 266
//                    printf("audio base %f\n", audio_base);
4438 Serge 267
            };
268
        }
269
        else av_free_packet(&packet);
270
    }
271
    else if (err != AVERROR_EOF)
272
        printf("av_read_frame: error %x\n", err);
273
274
 
275
}
276
277
 
278
 
279
 
6117 serge 280
{
4438 Serge 281
    int err = 0;
282
    AVPacket  packet;
283
284
 
6117 serge 285
        err = load_frame(vst);
286
4438 Serge 287
 
288
};
289
290
 
291
 
6117 serge 292
{
4438 Serge 293
    AVPacket  packet;
294
295
 
6117 serge 296
    avcodec_flush_buffers(vst->aCtx);
297
    while( get_packet(&vst->q_video, &packet) != 0)
298
        av_free_packet(&packet);
4438 Serge 299
300
 
6117 serge 301
        av_free_packet(&packet);
4438 Serge 302
303
 
6118 serge 304
4438 Serge 305
 
306
};
307
308
 
6117 serge 309
{
4438 Serge 310
    int       eof;
311
    AVPacket  packet;
312
    int       ret, vret, aret;
313
314
 
315
316
 
5592 serge 317
318
 
4438 Serge 319
    {
320
        int err;
321
322
 
323
        {
324
            case PREPARE:
325
                eof = fill_queue(vst);
6117 serge 326
4438 Serge 327
 
328
                {
329
                    if( (vst->q_video.size < 4*1024*1024) &&
6117 serge 330
                        (eof == 0) )
4438 Serge 331
                    {
332
                        eof = load_frame(vst);
6117 serge 333
                    }
4438 Serge 334
                    decode_video(vst);
6117 serge 335
                    ret = decode_audio(vst->aCtx, &vst->q_audio);
336
                }while(astream.count < resampler_size*2 &&
4438 Serge 337
                       ret == 1);
338
339
 
340
                decoder_state = PLAY;
341
                player_state  = PLAY;
342
343
 
344
                if( (vst->q_video.size < 4*1024*1024) &&
6117 serge 345
                    (eof == 0) )
4438 Serge 346
                {
347
                    eof = load_frame(vst);
6117 serge 348
                }
4438 Serge 349
                vret = decode_video(vst);
6117 serge 350
                aret = decode_audio(vst->aCtx, &vst->q_audio);
351
                ret = vret | aret;
4438 Serge 352
353
 
354
                {
355
                    decoder_state = STOP;
356
                    continue;
357
                };
358
359
 
360
                {
361
                    if( (vst->q_video.size < 4*1024*1024) &&
6117 serge 362
                        (eof == 0) )
4438 Serge 363
                    {
364
                        eof = load_frame(vst);
6117 serge 365
                        yield();
4438 Serge 366
                        continue;
367
                    };
368
                    delay(1);
369
                    continue;
370
                }
371
372
 
373
                continue;
374
375
 
376
                delay(1);
377
                continue;
378
379
 
380
 
381
                while(sound_state != STOP)
382
                    delay(1);
383
384
 
6117 serge 385
4438 Serge 386
 
6117 serge 387
                    rewind_pos = vst->fCtx->start_time;
388
                else
4438 Serge 389
                    rewind_pos = 0;
390
391
 
6117 serge 392
                                         rewind_pos, INT64_MAX, 0);
4438 Serge 393
394
 
395
                break;
396
397
 
398
                while(sound_state != STOP)
399
                    yield();
400
401
 
6117 serge 402
                int opts = 0;
4438 Serge 403
                if(rewind_pos < 0)
404
                {
405
                    rewind_pos = -rewind_pos;
406
                    opts = AVSEEK_FLAG_BACKWARD;
407
                };
408
409
 
6117 serge 410
                    rewind_pos += vst->fCtx->start_time;
411
4438 Serge 412
 
413
                min_pos = rewind_pos - 1000000;
414
                max_pos = rewind_pos + 1000000;
415
416
 
6117 serge 417
                                         rewind_pos, INT64_MAX, 0);
4438 Serge 418
                if (ret < 0)
419
                {
420
                    printf("could not seek to position %f\n",
421
                            (double)rewind_pos / AV_TIME_BASE);
422
                }
423
                decoder_state = PREPARE;
424
                break;
425
        }
426
    };
427
};
428