aboutsummaryrefslogtreecommitdiffstats
path: root/multimedia/ffmpeg045/files/grab_bsdbktr.c
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/ffmpeg045/files/grab_bsdbktr.c')
-rw-r--r--multimedia/ffmpeg045/files/grab_bsdbktr.c79
1 files changed, 28 insertions, 51 deletions
diff --git a/multimedia/ffmpeg045/files/grab_bsdbktr.c b/multimedia/ffmpeg045/files/grab_bsdbktr.c
index 06499141ea6..f071b2da00f 100644
--- a/multimedia/ffmpeg045/files/grab_bsdbktr.c
+++ b/multimedia/ffmpeg045/files/grab_bsdbktr.c
@@ -38,7 +38,8 @@ typedef struct {
int frame_format; /* see VIDEO_PALETTE_xxx */
int width, height;
int frame_rate;
- int frame_size;
+ INT64 per_frame;
+ INT64 last_frame_time;
} VideoData;
const char *video_device = "/dev/bktr0";
@@ -59,14 +60,10 @@ const char *video_device = "/dev/bktr0";
#endif
static UINT8 *video_buf;
-
-static int signal_expected = 0;
-static int unexpected_signals = 0;
-
+static int nsignals = 0;
static void catchsignal(int signal)
{
- if (!signal_expected) unexpected_signals++;
- signal_expected = 0;
+ nsignals++;
return;
}
@@ -88,6 +85,7 @@ static int bktr_init(AVFormatContext *s1, AVFormatParameters *ap)
width = s->width;
height = s->height;
+ s->last_frame_time = 0;
s->tuner_fd = open ("/dev/tuner0", O_RDWR);
if (s->tuner_fd < 0) {
@@ -103,7 +101,7 @@ static int bktr_init(AVFormatContext *s1, AVFormatParameters *ap)
geo.rows = height;
geo.columns = width;
geo.frames = 1;
- geo.oformat = METEOR_GEO_YUV_PACKED;
+ geo.oformat = METEOR_GEO_YUV_422 | METEOR_GEO_YUV_12;
if ((format == PAL) && (height <= (PAL_HEIGHT/2)))
geo.oformat |= METEOR_GEO_EVEN_ONLY;
@@ -131,7 +129,7 @@ static int bktr_init(AVFormatContext *s1, AVFormatParameters *ap)
perror ("METEORSINPUT");
return -EIO;
}
- video_buf = mmap((caddr_t)0, width*height*2, PROT_READ, MAP_SHARED,
+ video_buf = mmap((caddr_t)0, width*height*3, PROT_READ, MAP_SHARED,
video_fd, (off_t) 0);
if (video_buf == MAP_FAILED) {
perror ("mmap");
@@ -140,66 +138,45 @@ static int bktr_init(AVFormatContext *s1, AVFormatParameters *ap)
c = METEOR_CAP_CONTINOUS;
ioctl(s->fd, METEORCAPTUR, &c);
c = SIGUSR1;
- signal_expected = 1;
ioctl (s->fd, METEORSSIGNAL, &c);
return 0;
}
-static void bf_yuv422_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr,
- UINT8 *src, int width, int height)
-{
- int x, y;
- UINT8 *p = src;
- for(y=0;y<height;y+=2) {
- for(x=0;x<width;x+=2) {
- lum[0] = p[1];
- cb[0] = p[0];
- lum[1] = p[3];
- cr[0] = p[2];
- p += 4;
- lum += 2;
- cb++;
- cr++;
- }
- for(x=0;x<width;x+=2) {
- lum[0] = p[1];
- lum[1] = p[3];
- p += 4;
- lum += 2;
- }
- }
-}
-
/* note: we support only one picture read at a time */
static int grab_read_packet(AVFormatContext *s1, AVPacket *pkt)
{
VideoData *s = s1->priv_data;
int size, halfsize;
sigset_t msig;
- UINT8 *lum, *cb, *cr;
+ UINT64 curtime;
size = s->width * s->height;
halfsize = size << 1;
if (av_new_packet(pkt, size + halfsize) < 0)
return -EIO;
- if (unexpected_signals > 0) {
- unexpected_signals--;
- } else {
- signal_expected = 1;
- sigemptyset (&msig);
- sigsuspend (&msig);
+ curtime = av_gettime();
+ if (!s->last_frame_time
+ || ((s->last_frame_time + s->per_frame) > curtime)) {
+ if (!usleep (s->last_frame_time + s->per_frame + s->per_frame/8 - curtime)) {
+ if (!nsignals)
+ printf ("\nSLEPT NO signals - %d microseconds late\n",
+ av_gettime() - s->last_frame_time - s->per_frame);
+ }
+ } else if ((s->last_frame_time + s->per_frame*5 < curtime)) {
+ bzero (pkt->data, size + halfsize);
+ printf ("\nBlank %d signals - %d microseconds\n",
+ nsignals, curtime - s->last_frame_time - s->per_frame);
+ s->last_frame_time += s->per_frame;
+ return size + halfsize;
}
+ nsignals = 0;
- if (unexpected_signals & 1) {
- bzero (pkt->data, size + halfsize);
- } else {
- lum = pkt->data;
- cb = lum + size;
- cr = cb + size/4;
+ s->last_frame_time = s->last_frame_time
+ ? s->last_frame_time + s->per_frame
+ : av_gettime();
- bf_yuv422_to_yuv420p (lum, cb, cr, video_buf, s->width, s->height);
- }
+ memcpy (pkt->data, video_buf, size + halfsize);
return size + halfsize;
}
@@ -226,7 +203,7 @@ static int grab_read_header (AVFormatContext *s1, AVFormatParameters *ap)
s->width = width;
s->height = height;
s->frame_rate = frame_rate;
- s->frame_size = width*height*2;
+ s->per_frame = (INT64_C(1000000) * FRAME_RATE_BASE) / s->frame_rate;
st->codec.pix_fmt = PIX_FMT_YUV420P;
st->codec.codec_id = CODEC_ID_RAWVIDEO;
st->codec.width = width;