Subversion Repositories Kolibri OS

Rev

Rev 6121 | 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
 
6121 serge 29
4438 Serge 30
 
6121 serge 31
extern int resampler_size;
4438 Serge 32
33
 
34
char *movie_file;
35
36
 
6118 serge 37
4438 Serge 38
 
6117 serge 39
 
4438 Serge 40
41
 
42
43
 
5603 serge 44
45
 
4438 Serge 46
47
 
6117 serge 48
 
49
{
4438 Serge 50
    return (double)av_q2d(vst->fCtx->streams[vst->aStream]->time_base)*1000;
6117 serge 51
};
4438 Serge 52
53
 
54
 
55
{
56
    static vst_t vst;
6117 serge 57
    int i, ret;
58
    char *file_name, *dot;
4438 Serge 59
60
 
61
    {
62
        movie_file = get_moviefile();
63
        if(movie_file == NULL)
64
        {
65
            printf("Please provide a movie file\n");
66
            return -1;
67
        }
68
    }
69
    else movie_file = argv[1];
70
71
 
72
73
 
74
75
 
76
    avdevice_register_all();
77
    av_register_all();
78
79
 
6117 serge 80
    {
4438 Serge 81
        printf("Cannot open file %s\n\r", movie_file);
82
        return -1; // Couldn't open file
83
    };
84
85
 
6117 serge 86
4438 Serge 87
 
88
    if(avformat_find_stream_info(vst.fCtx, NULL) < 0)
6117 serge 89
    {
4438 Serge 90
        printf("Cannot find streams\n\r");
91
        return -1;
92
    };
93
94
 
95
    dot = strrchr(file_name,'.');
96
    if(dot)
97
    {
98
        movie_file = malloc(dot-file_name+1);
99
        memcpy(movie_file, file_name, dot-file_name);
100
        movie_file[dot-file_name] = 0;
101
    }
102
    else movie_file = file_name;
103
104
 
6117 serge 105
4438 Serge 106
 
107
    vst.vStream = -1;
6117 serge 108
    vst.aStream = -1;
109
110
 
111
    {
4438 Serge 112
        if(vst.fCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO
6117 serge 113
            && vst.vStream < 0)
114
        {
4438 Serge 115
            vst.vStream = i;
6117 serge 116
            video_time_base = vst.fCtx->streams[i]->time_base;
117
            if(stream_duration == 0)
4438 Serge 118
               stream_duration = vst.fCtx->streams[i]->duration;
6117 serge 119
        }
120
4438 Serge 121
 
6117 serge 122
           vst.aStream < 0)
123
        {
4438 Serge 124
            vst.aStream = i;
6117 serge 125
            if(stream_duration == 0)
4438 Serge 126
               stream_duration = vst.fCtx->streams[i]->duration;
6117 serge 127
        }
4438 Serge 128
    }
129
130
 
6117 serge 131
    {
4438 Serge 132
        printf("Video stream not detected\n\r");
133
        return -1; // Didn't find a video stream
134
    };
135
136
 
137
138
 
139
    vst.vCtx = vst.fCtx->streams[vst.vStream]->codec;
6117 serge 140
    vst.aCtx = vst.fCtx->streams[vst.aStream]->codec;
141
4438 Serge 142
 
6117 serge 143
    printf("codec id %x name %s\n",vst.vCtx->codec_id, vst.vCodec->name);
144
    printf("ctx->pix_fmt %d\n", vst.vCtx->pix_fmt);
145
4438 Serge 146
 
6133 serge 147
    INIT_LIST_HEAD(&vst.output_list);
148
    mutex_init(&vst.q_video.lock);
149
    mutex_init(&vst.q_audio.lock);
150
    mutex_init(&vst.gpu_lock);
151
    mutex_init(&vst.decoder_lock);
152
    mutex_init(&vst.input_lock);
153
    mutex_init(&vst.output_lock);
154
155
 
6117 serge 156
    {
157
        printf("Unsupported codec with id %d for input stream %d\n",
4438 Serge 158
        vst.vCtx->codec_id, vst.vStream);
6117 serge 159
        return -1; // Codec not found
4438 Serge 160
    }
161
162
 
6121 serge 163
        return -1;
164
6117 serge 165
 
166
    {
4438 Serge 167
        printf("Error while opening codec for input stream %d\n",
168
                vst.vStream);
6117 serge 169
        return -1; // Could not open codec
4438 Serge 170
    };
171
172
 
6121 serge 173
4438 Serge 174
 
6117 serge 175
        vst.aCtx->request_channels = FFMIN(2, vst.aCtx->channels);
176
    else
4438 Serge 177
        vst.aCtx->request_channels = 2;
6117 serge 178
4438 Serge 179
 
6117 serge 180
4438 Serge 181
 
6117 serge 182
    {
4438 Serge 183
        if(avcodec_open2(vst.aCtx, vst.aCodec, NULL) >= 0 )
6117 serge 184
        {
4438 Serge 185
            WAVEHEADER       whdr;
186
            int fmt;
187
            int channels;
188
189
 
190
            vst.aCtx->sample_rate, vst.aCtx->channels, vst.aCtx->sample_fmt );
6117 serge 191
            whdr.riff_id = 0x46464952;
4438 Serge 192
            whdr.riff_format = 0x45564157;
193
            whdr.wFormatTag = 0x01;
194
            whdr.nSamplesPerSec = vst.aCtx->sample_rate;
6117 serge 195
            whdr.nChannels = 2;
4438 Serge 196
            whdr.wBitsPerSample = 16;
197
198
 
6117 serge 199
4438 Serge 200
 
201
202
 
203
            {
204
                decoder_buffer = (uint8_t*)av_mallocz(192000*2+64);
205
                if( decoder_buffer != NULL )
206
                {
207
                    mutex_init(&astream.lock);
5603 serge 208
                    astream.count  = 0;
4438 Serge 209
                    astream.buffer = (char *)av_mallocz(192000*3);
210
                    if( astream.buffer != NULL )
211
                        have_sound = 1;
212
                    else
213
                        av_free(decoder_buffer);
214
                }
215
                if( have_sound == 0)
216
                {
217
                        printf("Not enough memory for audio buffers\n");
218
                }
219
            }
220
        }
221
        else printf("Cannot open audio codec\n\r");
222
    }
223
    else printf("Unsupported audio codec!\n");
224
225
 
6117 serge 226
        return 0;
4438 Serge 227
228
 
6133 serge 229
230
 
6117 serge 231
4438 Serge 232
 
233
 
234
235
 
5603 serge 236
           (AUDIO_THREAD | VIDEO_THREAD))
237
           delay(1);
238
4438 Serge 239
 
5603 serge 240
        mutex_destroy(&astream.lock);
241
4438 Serge 242
 
6117 serge 243
    mutex_destroy(&vst.q_audio.lock);
244
    mutex_destroy(&vst.decoder_lock);
6133 serge 245
    return 0;
4438 Serge 246
}
247
248
 
249
 
6117 serge 250
{
4438 Serge 251
    AVPacket  packet;
252
    int err;
253
254
 
6117 serge 255
    if( err == 0)
4438 Serge 256
    {
257
        if(packet.stream_index == vst->vStream)
6117 serge 258
            put_packet(&vst->q_video, &packet);
259
        else if( (packet.stream_index == vst->aStream) &&
260
                  (have_sound != 0) )
4438 Serge 261
        {
262
            put_packet(&vst->q_audio, &packet);
6117 serge 263
            if(audio_base == -1.0)
4438 Serge 264
            {
265
                if (packet.pts != AV_NOPTS_VALUE)
266
                    audio_base = get_audio_base(vst) * packet.pts;
6117 serge 267
//                    printf("audio base %f\n", audio_base);
4438 Serge 268
            };
269
        }
270
        else av_free_packet(&packet);
271
    }
272
    else if (err != AVERROR_EOF)
273
        printf("av_read_frame: error %x\n", err);
274
275
 
276
}
277
278
 
279
 
280
 
6117 serge 281
{
4438 Serge 282
    int err = 0;
283
    AVPacket  packet;
284
285
 
6117 serge 286
        err = load_frame(vst);
287
4438 Serge 288
 
289
};
290
291
 
292
 
6117 serge 293
{
4438 Serge 294
    AVPacket  packet;
295
296
 
6117 serge 297
    avcodec_flush_buffers(vst->aCtx);
298
    while( get_packet(&vst->q_video, &packet) != 0)
299
        av_free_packet(&packet);
4438 Serge 300
301
 
6117 serge 302
        av_free_packet(&packet);
4438 Serge 303
304
 
6118 serge 305
4438 Serge 306
 
307
};
308
309
 
6117 serge 310
{
4438 Serge 311
    int       eof;
312
    AVPacket  packet;
313
    int       ret, vret, aret;
314
315
 
316
317
 
5592 serge 318
319
 
4438 Serge 320
    {
321
        int err;
322
323
 
324
        {
325
            case PREPARE:
326
                eof = fill_queue(vst);
6117 serge 327
4438 Serge 328
 
329
                {
330
                    if( (vst->q_video.size < 4*1024*1024) &&
6117 serge 331
                        (eof == 0) )
4438 Serge 332
                    {
333
                        eof = load_frame(vst);
6117 serge 334
                    }
4438 Serge 335
                    decode_video(vst);
6117 serge 336
                    ret = decode_audio(vst->aCtx, &vst->q_audio);
337
                }while(astream.count < resampler_size*2 && ret == 1);
6133 serge 338
4438 Serge 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