practice film, to our servers using our custom uploader. Transcode & Index we then transcode that video and tag every event in the film, grouping them into plays. This is done with our itag app. Deliver Once the video is transcoded and indexed, it is available to the coaches and players on our site and mobile app. we stream the video from our servers to client’s html5 video player via our intelligence app. 1 2 3 >What we do, in slightly more detail Krossover www.krossover.com twitter.com/krossovr
videos uploaded 29tb raw data uploaded 5.8tb compressed data stored 5,357 User accounts 6.3 million user actions in the past year 13.5 million searchable data points indexed in the past 2 basketball seasons 600k searchable data points indexed in the past 2 lacrosse seasons
indexed play list of events indexed in current play Choice of next event When indexing a game, the possible next events, keyboard shortcuts, and event metadata (name, type, etc.) are all being pulled from mongo.
of plays indexed in current game Choice of search filters that can be applied our search paradigm is filter, rather than keyword, based. A user applies one or more filters and plays are filtered out that don’t match the criteria provided.
of plays after applying 3 search filters everything users interact with in search - the filters, the results, and the associated metadata, is stored in mongo.
app intelligence app json-rpc api vit widget vit (video intelligence tool) consumes the json-rpc api and detects whether it is in coach mode or indexing mode. In indexing mode, it loads the data needed for indexing. In coach mode, it loads plays. 1 intelligence app loads VIT on game overview and search pages in coach mode and publishes the json-rpc api. 2 itag app pulls vit in from the intelligence app and loads it in indexer mode. 3 json-rpc api allows the intelligence app, the itag app, and vit to communicate and access data based on context. 4
twitter.com/krossovr event data point next event data point event play a game is made up of many plays, which are strings of events. Each event consists of multiple data points. every event has certain next events, which are events that can logically follow it in gameplay. time
events lie at the heart of krossover’s apps. the commonalities between event flow definitions across sports allow us to re- use code, while the differences demand flexibility. This requirement for a fluid yet similar event flow definition from sport to sport makes it a perfect candidate for being stored as a document in Mongo. event data point next event data point event play time
description field collection dimensions unit height width heightpx widthpx displayFieldDivisor fieldOriginX fieldOriginY timeLineUnit region regionId specification dimensions unit height width svg (svg data) region description region title All of our schema rely on some combination of embedding and linking. For modeling a football field, we embed most of the fields we need and link to regions, which are also used when indexing (i.e., did the event occur in the top, center, or bottom region?). We also use this kind of schema design for stats.
technique we use is to pull in data from within the document. Here, we’re pulling player1 and location from fieldSeq and using this info in the script. we also use this technique for search. gameTeamId script shortcutKey fieldSeq player1 location event eventTitle player1 homePlayer awayPlayer location xcoord ycoord nextEvents status accepted declined { "_id": ObjectId("4f31669677a295f549000013"), "event": "dead ball penalty", "eventTitle": "Dead Ball Penalty", "fieldSeq": { "0": "player1", "1": "location" }, "gameTeamId": "player1", "location": { "0": "#xcoord", "1": "#ycoord" }, "nextEvents": [ ], "player1": { "0": "#homePlayer", "1": "#awayPlayer" }, "script": "After play was ruled dead, a penalty was called on {{{player1}}}at the {{positionFieldX}} yard line", "shortcutKey": "p", "status": { "0": "#accepted", "1": "#declined" }, "timeContext": "standalone" }
symbol by jon trillana, “video” symbol by anas ramadan, “video search” symbol by luis rodriguez, from the noun project collection. “amazon” and the “Amazon web services” logo are registered trademarks of amazon.com, inc. “apache” and the “apache http server project” logo are registered trademarks of the apache software foundation. “git” logo by jason long. “html5” logo by w3c. “Jenkins” logo by the Jenkins Project. “krossover” and the “krossover” logo are registered trademarks of krossover intelligence, inc. “MongoDB”, “mongo”, and the “leaf” logo are registered trademarks of 10gen, inc. “mysql” and the “mysql” logo are registered trademarks of the oracle corporation. “Novecento” typeface by jan tonellato. “PHP” logo by the PHP project. “Rackspace” and the “Rackspace” logo are registered trademarks of rackspace US, inc. “Subversion” and the “subversion” logo are registered trademarks of the apache software foundation. “Yii framework” logo by the Yii Framework. krossover team mallik arjun developer chaitra bhat developer semih cicek designer carlo dicelico developer cyriel dikoume developer kevin haggerty developer stella km developer karthik KN developer abhinav kumar developer R S Sagar developer Abhishek srinivas developer girish walavalkar developer glenn yonemitsu developer vasu kulkarni ceo james piette, phd vp analytics alex kirtland vp products design/ux sandip chaudhari Cto david mayberry director of sales & marketing brett bivens directer of operations sean mccleary Project Manager amyn bandali business development alicia quintero client services Krossover www.krossover.com twitter.com/krossovr