Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Apr 25 2018 07:30
    hirohitokato closed #6
  • Oct 20 2017 05:16

    hirohitokato on master

    Update README.md (compare)

  • Oct 20 2017 05:15

    hirohitokato on master

    Update README.md (compare)

  • Oct 20 2017 02:51
    hirohitokato closed #8
  • Oct 20 2017 02:51
    hirohitokato commented #8
  • Oct 20 2017 02:50
    hirohitokato closed #7
  • Oct 20 2017 02:50
    hirohitokato commented #7
  • Oct 19 2017 11:15

    hirohitokato on 0.6.0

    (compare)

  • Oct 19 2017 11:14

    hirohitokato on v0.6.1

    (compare)

  • Oct 19 2017 11:14

    hirohitokato on 0.8.0

    (compare)

  • Oct 19 2017 11:13

    hirohitokato on master

    Bump the version, update README… (compare)

  • Oct 19 2017 11:07

    hirohitokato on swift4

    (compare)

  • Oct 19 2017 11:07

    hirohitokato on master

    Update build setting to swift4 protocol `Printable,DebugPrinta… `CMSampleBufferRef` to `CMSampl… and 29 more (compare)

  • Oct 19 2017 11:07
    hirohitokato closed #9
  • Oct 19 2017 11:07
    hirohitokato assigned #9
  • Oct 19 2017 11:07
    hirohitokato opened #9
  • Oct 19 2017 11:06

    hirohitokato on swift4

    Resolve fatal error(1): Add pri… Reconnect IBActions Update copyright year and 1 more (compare)

  • Oct 19 2017 10:35

    hirohitokato on swift4

    Update build setting to swift4 protocol `Printable,DebugPrinta… `CMSampleBufferRef` to `CMSampl… and 24 more (compare)

  • Jun 08 2017 07:51
    iosfitness opened #8
  • Nov 30 2015 18:44
    jainanshul commented #7
Norio Nomura
@norio-nomura
デッドロックしてるような。
Hirohito Kato
@hirohitokato
ですです。困ったものです…
(ハングだと意味が違うことに気付きました…)
Norio Nomura
@norio-nomura
これはdispatch_syncdispatch_asyncのデッドロックだよ。
syncのなかでasyncを呼んでるここ
    func nextSampleBuffer() -> (sbuf:CMSampleBufferRef, frameDuration:CMTime)! {
        var result: (sbuf:CMSampleBufferRef, frameDuration:CMTime)! = nil
        sync { me in
            if me._currentSampleBuffer != nil {
                result = me._currentSampleBuffer
                me._currentSampleBuffer = nil
            } else {
                result = me._prepareNextBuffer()
            }

            me.async { me in
                me._currentSampleBuffer = me._prepareNextBuffer()
            }
        }
        return result
    }
Hirohito Kato
@hirohitokato
ちょっと待ってください?!
Norio Nomura
@norio-nomura
画面が固まったところで、Debug>Pause
⌘6でDebug Navigatorを表示
Hirohito Kato
@hirohitokato
その確認はさんざんしていたのですが、いやしかし、この処理は毎回通るはずなので、ランダムにデッドロックするというのがまだ理解できてないです。
ちょっと確認してきます。
Norio Nomura
@norio-nomura
先日「シリアルキューは呼び出し元スレッドで実行される」って話をしましたよね。
あれには条件があって、キューが空の時は呼び出し元スレッドで実行されます。
Hirohito Kato
@hirohitokato
空のとき、ですか。
Norio Nomura
@norio-nomura
あと、既にキューに処理待ちのブロックが入ってて、別スレッドで実行されているときには、そのスレッドで実行されるようにキューに積まれます。
あいや、違うな。
ごめん、違うわ。
Hirohito Kato
@hirohitokato
上(アプリ)でシリアライズしてても、AVFoundationからしてみれば複数スレッドから呼ばれるからまずい、という可能性はあるような気がしてきました。
えっ
いやしかし、ありがとうございます。
Norio Nomura
@norio-nomura
copyNextSampleBuffer()がスレッドセーフじゃないのかな。
Hirohito Kato
@hirohitokato
その可能性は高いです…。
Norio Nomura
@norio-nomura
結局、今のコードだとスレッドを固定できてないもんね。
Hirohito Kato
@hirohitokato
そうなんですよね。そこに一縷の望みをかけるべきか…。明日にでも試してみます!
Hirohito Kato
@hirohitokato
ためしに全部メインスレッドで実行してみるか…
Hirohito Kato
@hirohitokato
ためしにsync/asyncメソッドを、dispatch_〜を呼ばずに実行してみたら(多分これで全部メインスレッドになるはず)、見事にデッドロック(?)が起こりました。もうちょっと見てみます。
Hirohito Kato
@hirohitokato
うん、⌘-6のDebug Navigatorで見ても、アプリだけ見ればメインスレッドで自縄自縛していました。しかしシステムライブラリではたくさんスレッドを起動しているという、手を出せない状況だこれ。
Norio Nomura
@norio-nomura
頻繁に作り直すAVFoundationのオブジェクトがあるなら、それの解放タイミングを見直してみるとか?いま出先なのでコード読めないけど、例えばキャンセルした後とか。
Hirohito Kato
@hirohitokato
解放タイミング(=cancelReading/stopLoading)を遅らせることは試していませんでした。やってみます!
Norio Nomura
@norio-nomura
何かの処理が終わらないうちにオブジェクトがいなくなってるような気がするんだよね。
Hirohito Kato
@hirohitokato

解放タイミングを、キャンセルしてから0.1sごとにしてみるべく以下のコードを書いて動かしてみましたが、残念なことに同じようにロックしてしまいました。メインスレッドだけで実行しても、同様。

    private var _dustBox = [AssetReaderFragment]()
    func f() {
        if !self._dustBox.isEmpty {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))), self._decodeQueue) {
                self._dustBox.removeAtIndex(0)
                self.f()
            }
        }
    }
    func cancelReading(async asyncFlag: Bool=true) {
        let operation = { [unowned self] ()->Void in
            // 要素をゴミ箱に移動
            self._dustBox = self._readers
            self._readers.removeAll(keepCapacity: false)

            // ゴミ箱の要素を少しずつ削除
            self.f()
        }
        if asyncFlag {
            async { me in operation() }
        } else {
            operation()
        }
    }

とほほ

Norio Nomura
@norio-nomura
Gitterのウィンドウを大きくすると、右側にActivityってのが出てくるの知らなかった。
Hirohito Kato
@hirohitokato
本当ですね。意識してませんでした。
Norio Nomura
@norio-nomura
integrationの通知はActivityに出るらしく、メッセージじゃないので、iOSアプリへ通知されなかった。なので、Travisのビルド通知をiOSデバイスで受け取ろうとしたのだけどダメでした。
Norio Nomura
@norio-nomura
cancelReading()した後、nilが返ってくるまでcopyNextSampleBuffer()してみるとか。cancelReading()後にnil以外が返ることがあるのかどうか知らないけど。
Hirohito Kato
@hirohitokato
cancelReading()以降でnil以外が返ってくることは、見た限りではなさそうですね。逆に、nilが返るまで全てcopyNextSampleBuffer()してからcancelReading()しても問題は発生(時間差でcancelReading()していても)。
ただ、AVAssetReaderVideoCompositionOutputではなくAVAssetReaderTrackOutputで取り出すようにしたら、問題が発生しなくなりました。・・・それだとパフォーマンス的にスローモーション再生しかできないので辛いですが><
Norio Nomura
@norio-nomura
AssetReaderFragmentのassetに対する操作を極力減らしてみるとか。
Hirohito Kato
@hirohitokato
ありがとうございます。一昨日だったかにdeinitで呼んでいるcancelReading()&cancelLoading()を消してみたのですが、ぜんぜん変わらなかったという有様でした…。
Hirohito Kato
@hirohitokato
色々試して気付いたのですが、cancelReading()をずらして実行すると、そうでないときに比べて落ちる率が若干低いようです。
で、AVAssetReaderTrackOutput を使うとやはりデッドロックしないので、悔しいですが katokichisoft/SimpleGaplessPlayer@f78980c でAs-Isでの再生時はAVAssetReaderTrackOutputを使うようにしてみました :-1: 。別件との連携動作においては、これで最低限の仕様は満たせるようになるので。
Norio Nomura
@norio-nomura
self.URL = (asset as? AVURLAsset)?.URL
Hirohito Kato
@hirohitokato
おお、なるほどー:+1:
Hirohito Kato
@hirohitokato
某b2でも状況変わらず。
Hirohito Kato
@hirohitokato
スローモーション(As-Isモード)で再生しているときに、スライダーで指定した位置がちょうどアセットの末尾だと再生が止まってしまう問題を修正しました。
あと、v0.6.1としてタグをpushしました。
Hirohito Kato
@hirohitokato
p.6のiOSの図、Core Videoとか入っていないのはわざとかしら…?CVPixelBufferとか使っているのに。
Norio Nomura
@norio-nomura
開発スピードが速すぎて、ドキュメント更新が追いついていないもの多いですよね。
Norio Nomura
@norio-nomura
gitterドラッグアンドドロップで画像ファイルをアップロードできるやん。
Hirohito Kato
@hirohitokato

以前バグレポしていたcopyNextSampleBuffer()の中でハングするバグ、ようやくレスポンスがありました。

Apple Developer Relations11-Aug-2015 03:55 AM

Engineering has determined that your bug report is a duplicate of another issue and will be closed.

The open or closed status of the original bug report your issue was duplicated to appears in the yellow "Duplicate of XXXXXXXX" section of the bug reporter user interface. This section appears near the top of the right column's bug detail view just under the bug number, title, state, product and rank.

iOS8.4では再現しているので、iOS9にしたら試してみます。