]> rtime.felk.cvut.cz Git - frescor/streamer.git/blob - input.c
License
[frescor/streamer.git] / input.c
1 /*
2  *  Copyright (c) 2008 Luca Abeni
3  *
4  *  This is free software; see GPL.txt
5  */
6 #include <string.h>
7 #include "libavformat/avformat.h"
8 #include "input.h"
9
10 static uint64_t time_convert(uint64_t time, AVStream *st)
11 {
12     if (st->start_time != AV_NOPTS_VALUE) {
13 #if 1
14         time -= st->start_time;
15 #else
16 fprintf(stderr, "%Ld\t%Ld\n", st->start_time, av_rescale_q(st->start_time,
17                                   st->time_base, AV_TIME_BASE_Q));
18 #endif
19     }
20     time = av_rescale_q(time, st->time_base, AV_TIME_BASE_Q);
21
22     return time;
23 }
24
25 static void time_base_convert(AVPacket *pkt, AVStream *st)
26 {
27   if (pkt->pts != AV_NOPTS_VALUE) {
28     pkt->pts = time_convert(pkt->pts, st);
29   }
30   if (pkt->dts != AV_NOPTS_VALUE) {
31     pkt->dts = time_convert(pkt->dts, st);
32   }
33   if (pkt->duration != 0) {
34     pkt->duration = av_rescale_q(pkt->duration, st->time_base, AV_TIME_BASE_Q);
35   }
36 }
37
38 AVFormatContext *open_input_stream(const char *fname, int w, int h, int fps)
39 {
40     AVFormatContext *s;
41     AVInputFormat *fmt;
42     AVFormatParameters param;
43     int res;
44
45     memset(&param, 0, sizeof(AVFormatParameters));
46     /* FIXME: Set these!!! */
47     param.width  = w;
48     param.height = h;
49     param.pix_fmt = PIX_FMT_YUV420P;
50     param.time_base.den = fps;
51     param.time_base.num = 1;
52     fmt = av_find_input_format("video4linux2");
53     res = av_open_input_file(&s, fname, fmt, 0, &param);
54     if (res < 0) {
55         fprintf(stderr, "Error opening %s: %d\n", fname, res);
56
57         return NULL;
58     }
59
60     res = av_find_stream_info(s);
61     if (res < 0) {
62         fprintf(stderr, "Cannot find codec parameters for %s\n", fname);
63
64         return NULL;
65     }
66
67     dump_format(s, 0, fname, 0);
68
69     return s;
70 }
71
72 void close_input_stream(AVFormatContext *s)
73 {
74     av_close_input_file(s);
75 }
76
77 AVPacket *read_input_packet(AVFormatContext *s)
78 {
79     static AVPacket pkt;
80     AVStream *st;
81     int res;
82
83     res = av_read_frame(s, &pkt);
84     if (res < 0) {
85         return NULL;
86     }
87
88     st = s->streams[pkt.stream_index];
89     if (pkt.dts == AV_NOPTS_VALUE) {
90         fprintf(stderr, "WTF??? Unknown DTS???\n");
91
92         return NULL;
93     }
94
95     time_base_convert(&pkt, st);
96
97     return &pkt;
98 }