comparison src/tssplitter_lite.c @ 143:e72dd5e8d53f

Number of samples per ADTS packet instead of 1000 and 1024.
author Naoya OYAMA <naoya.oyama@gmail.com>
date Sun, 29 Jul 2012 23:16:30 +0900
parents 9c7bc6c0327e
children 066f33b2213a
comparison
equal deleted inserted replaced
142:d65c15276b5e 143:e72dd5e8d53f
1 /* -*- tab-width: 4; indent-tabs-mode: t -*- */ 1 /* -*- tab-width: 4; indent-tabs-mode: t -*- */
2 /* vim: set ts=4 sts=4 sw=4 noexpandtab number : */ 2 /* vim: set ts=4 sts=4 sw=4 noexpandtab number : */
3 /* tssplitter_lite.c -- split TS stream. 3 /* tssplitter_lite.c -- split TS stream.
4 4
5 Copyright 2009 querulous 5 Copyright 2009 querulous
6 Copyright 2010 Naoya OYAMA <naoya.oyama@gmail.com> 6 Copyright 2010-2012 Naoya OYAMA <naoya.oyama@gmail.com>
7 7
8 This program is free software: you can redistribute it and/or modify 8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or 10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version. 11 (at your option) any later version.
1598 } 1598 }
1599 /* 1599 /*
1600 * オーディオをファイル出力し始める条件(1. 2. を満たすこと) 1600 * オーディオをファイル出力し始める条件(1. 2. を満たすこと)
1601 * 1. 動画の蓄積は開始されている 1601 * 1. 動画の蓄積は開始されている
1602 * 2. 動画のGOPの1番目のIピクチャのPTSとオーディオのPTSを比較して以下のどちらかを満たすこと 1602 * 2. 動画のGOPの1番目のIピクチャのPTSとオーディオのPTSを比較して以下のどちらかを満たすこと
1603 * 2.1. 差分が11msec以内(1000*90k/AACのサンプリング周波数) 1603 * 2.1. 差分が11msec以内(1024*90k/AACのサンプリング周波数)
1604 * 1000 : ADTSデータの1フレームのサンプル数 1604 * 1024 : ADTSデータの1フレームのサンプル数
1605 * 90k : PTSの周波数 1605 * 90k : PTSの周波数
1606 * 2.2. 過ぎている(過ぎている場合はオーディオESの蓄積の継続と次のGOP狙いにする?) 1606 * 2.2. 過ぎている(過ぎている場合はオーディオESの蓄積の継続と次のGOP狙いにする?)
1607 * #動画よりオーディオ側の方が先にESバッファの蓄積を始めるハズなので気にすること無いかなぁ… 1607 * #動画よりオーディオ側の方が先にESバッファの蓄積を始めるハズなので気にすること無いかなぁ…
1608 */ 1608 */
1609 else if ( (is_audio_stream(pid, esbuf) != -1) && !(esbuf->started) ) { 1609 else if ( (is_audio_stream(pid, esbuf) != -1) && !(esbuf->started) ) {
1619 } else if ( esbuf->Program->video_start ) { /* video 蓄積が開始されている?*/ 1619 } else if ( esbuf->Program->video_start ) { /* video 蓄積が開始されている?*/
1620 printf("audio stream. pid[%d] a_pts[%llu] v_pts[%llu] size[%d].\n", pid, esbuf->pts, esbuf->Program->video_pts, esbuf->size); 1620 printf("audio stream. pid[%d] a_pts[%llu] v_pts[%llu] size[%d].\n", pid, esbuf->pts, esbuf->Program->video_pts, esbuf->size);
1621 audio_lipsync_offset = 0; 1621 audio_lipsync_offset = 0;
1622 audio_pts = esbuf->pts; 1622 audio_pts = esbuf->pts;
1623 adts_freq = AnalyzeAdifHeader(esbuf); 1623 adts_freq = AnalyzeAdifHeader(esbuf);
1624 adts_frame_time = (int64_t)((float)1000*90000/adts_freq); /* PTSは90KHz */ 1624 adts_frame_time = (int64_t)((float)1024*90000/adts_freq); /* PTSは90KHz */
1625 /* オーディオをフレーム単位で捨ててPTSを進める */ 1625 /* オーディオをフレーム単位で捨ててPTSを進める */
1626 while ( (esbuf->Program->video_pts > audio_pts +adts_frame_time/2) ) { 1626 while ( (esbuf->Program->video_pts > audio_pts +adts_frame_time/2) ) {
1627 /* オーディオデータを捨てると audio_pts は1フレーム分大きくなる */ 1627 /* オーディオデータを捨てると audio_pts は1フレーム分大きくなる */
1628 i = next_adts_start_code(esbuf, audio_lipsync_offset); /* 次のAACのデータを取得 */ 1628 i = next_adts_start_code(esbuf, audio_lipsync_offset); /* 次のAACのデータを取得 */
1629 if ( i != -1 ) { /* AACデータの終端か? */ 1629 if ( i != -1 ) { /* AACデータの終端か? */