Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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