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