post by tommy @ 04 五月, 2013 10:29
這個我不確定算是 mencoder 還是 Linux kernel 3.9 的問題. 反正兩者放一起就是有問題就對了.
發生的原因是在 Linux kernel 3.9 中, 對於 V4L2 的時間取得改成使用 monotonic timestamp (透過 v4l2_get_timestamp() 來處理), 但是在 mencoder 中, 似乎沒辦法正確去判斷是一般的 timestamp 還是 monotonic timestamp 就直接當成一般的時間來處理, 所以在計算時間上就有問題.
直接對 kernel 修改, 似乎是比較快的方式, 所以... 我就直接把 v4l2_get_timestamp() 改回原本用的 do_gettimeofday() 來處理, 這樣子在 mencoder 就可以正確的處理了.
例如:
--- linux/drivers/media/pci/saa7134/saa7134-core.c.orig 2013-05-03 14:41:58.146094840 +0800
+++ linux/drivers/media/pci/saa7134/saa7134-core.c 2013-05-03 14:42:23.690886995 +0800
@@ -308,7 +308,7 @@
/* finish current buffer */
q->curr->vb.state = state;
- v4l2_get_timestamp(&q->curr->vb.ts);
+ do_gettimeofday(&q->curr->vb.ts);
wake_up(&q->curr->vb.done);
q->curr = NULL;
}
上面是對 saa7134 的處理, 如果你用的是其他的模組, 就要去修改該模組的內容, 或... 直接去改 v4l2_get_timestamp() 也是可以.