Thursday, December 8, 2011
Cap Table
Cap Table spreadsheet
Tuesday, July 26, 2011
Netflix Price Change: What does it mean for Netflix?
- Average number of paid subscribers = 14.786m
- Average revenue per subscriber per month= $12.19
- Total revenues = $2162.625m
Old Plan | New Plan | % Increase | |
Streaming only | $7.99 | $7.99 | 0.00% |
Streaming + 1 DVD | $9.99 | $15.98 | 59.96% |
Streaming + 2 DVD | $14.99 | $19.98 | 33.29% |
Old Plan | New Plan | |
Add 1 DVD | $2.00 | $7.99 |
Add 2 DVDs | $7.00 | $11.99 |
- Streaming + 1 DVD customers are likely to switch to streaming only plan
- Streaming + 2 DVD customers are likely to swallow the price hike
- There is a significant % of streaming + 2 DVD subscribers
Segment | Number of Customers (million) |
Streaming Only | 1.26 |
Streaming + 1 DVD | 6.91 |
Streaming + 2 DVD | 4.40 |
- Scenario 1
Segment | Number of Customers (million) |
Streaming Only | 8.17 |
Streaming + 1 DVD | 0.00 |
Streaming + 2 DVD | 4.40 |
- Scenario 2
Segment | Number of Customers (million) |
Streaming Only | 4.71 |
Streaming + 1 DVD | 0.00 |
Streaming + 2 DVD | 4.40 |
- Scenario 3
Segment | Number of Customers (million) |
Streaming Only | 4.71 |
Streaming + 1 DVD | 0.00 |
Streaming + 2 DVD | 2.20 |
Wednesday, July 20, 2011
Deconstructing Pandora’s S-1
Pandora’s IPO filing with the SEC (S-1 form here) revealed some interesting information about its customer base, sources of revenues, licensing costs and other financial data. When I first saw the numbers, I got curious as to what the numbers meant. Here is what I could deduce:
Data from S-1
1. 9 month revenues: $90,123,000 (Jan-Oct, 2010)
2. Total registered users: 71m
3. Pandora has two classes of users:
- Free users who can listen to up to 40 hours of music per month. If a free user exceeds the 40 hour cap, he/she can pay $0.99 to remove that limit for the rest of the month.
- Subscribers who pay $36 per year ($3/month) to get higher quality audio and no ads.
4. 13.6% of revenues come from paid customers (subscribers as well as users who paid the $0.99 for overage)
If we assume that all registered users are active and all of the paid customers are subscribers (i.e. we ignore overage users), we have:
Revenue Mix
- Revenues per month = $10.01m ($90.12/9)
- Revenues from paid customers per month = $1.36m ($10.01*13.6%)
- Revenues from free users per month = $8.65m ($10.01 - $1.36)
- Number of paid subscribers = 0.45m ($1.36/$3)
- Number of free users = 70.55m (71m – 0.45m)
86.40% of the revenues are generated by the free users.
Implied CPM
If we assume that on an average each free user listens to 15 hours of music, we have:
- Number of songs streamed per month = 257 (15*60/3.5, assuming an average 3.5 mins per song)
Pandora shows an ad for every three songs on an average. It also shows an ad when the user interacts with the Pandora application (skip or rate a song). There is limit of 10 skips per hour. But let us ignore all the skipping/rating part for a moment.
- Advertisements per song = 0.33 (1 ad per 3 songs)
- Number of ads per month per free user = 86 (257*0.33)
- Total number of ads served (all free users) per month = 6047m (86 * 70.55)
- Implied CPM = $1.43 ($8.65/(6047/1000))
Now that's a pretty low CPM! I am also assuming that all registered free users are active listeners which is certainly a stretch. If we assume only 50% of free users are active, we get:
Implied CPM = $2.86 ($8.65/(3023/1000)) which is also fairly low.
We can also do a backwards calculation to estimate % of active users by assuming a reasonable CPM rate. Lets say Pandora's CPM is $10.
This gets an active free user % of about 14%.
Paid vs. Free Customers
If we assume a CPM of $10, the ARPU for free user is $10.32 (12 * $10*86/1000) vs $36.00 for a paid subscriber.
Monday, June 27, 2011
Innovation in Media & Entertainment Industry
Technology Adoption Cycles
In the M&E industry the skew of the S-curve is large with much higher adoption time compared to, say the microprocessor technology. To demonstrate this point, the adoption of HDTV can be a helpful example. The process of HDTV standardization in the US was started with the formation of the “Grand Alliance” in 1993, with the standard being adopted by the FCC in 1996. Even today, 14+ years after the standard was ratified, HDTV penetration in the US is just close to 46%. On the other hand, adoption of VCR was fairly rapid because of lack of strong interdependencies among the players in the value chain. In general, the more complex the technology in terms of the need for involvement from multiple players, the slower its adoption technology by the industry and consumers. This can be attributed to the following key reasons:
a) Cyclic interdependencies
In the case of the M&E industry, players have strong dependency on each other and in many cases this creates a chicken-and-egg situation where no player wants to invest in new technology before others make a commitment. In the case of HDTV, content creators would not invest in new cameras and post-production equipment before they saw the CE industry pushing HDTV technology for in-home viewing. The CE industry, on the other, wanted the content creators to first create compelling HD content to spur interest and demand for in-home players. In the media industry, technology adoption by the players is required to be done in lock-step for it to be successful. b) Mismatch in innovation cycles in sub-industries
Innovation cycles within the M&E industry are unique for each of the four main categories of players - content creators, distributors, CE firms, and technology providers, adding complexity. For HDTV, though the technology providers came together to create the required standard, the distribution networks (cable/satellite) did not have enough capacity to handle the HDTV bandwidth requirements economically. Efficient video compression technology that would reduce the bandwidth requirements for HDTV was still under development. And from a consumer device perspective, the HDTV technology was still expensive. Because of high costs for LCD and plasma display technology, the price of an HDTV was prohibitive to a common household 10 years ago. Thus timing of innovation cycles can be a limiting, or encouraging, factor in the adoption of new technologies.
Tuesday, January 27, 2009
H.264/Theora Debate Continues
How to Implement a System Call in FreeBSD
Steps involved in implementing a new system call in FreeBSD
There are three main source and header files that are associated with system calls. These are :
a) /usr/src/sys/kern/init_sysent.c
This file contains a table sysent , each entry of which stores two things :
1. the number of parameters to the system call and
2. the function that implements the system call.
b) /usr/src/sys/kern/syscalls.c
This file contains the table of names of all the system calls.
c) /usr/src/sys/sys/syscalls.h
This is the header file that contains the #defines for all system call numbers. For example getpid() has a system call number 20 that is defined as :
#define SYS_getpid 20
Luckily you don't have to edit any of these files yourself to implement a new system call. The process of setting up the correct prototypes, #defines, etc is automated which will becme clear shortly.
Let us take up a contrived example of implementing a fictitious and arguably useless system call : int syshello(char *) that simply returns the string "hello" in the buffer supplied. Note that I did not bother to check the size of the buffer (bad programming karma!) before copying the string.
1. Edit /usr/src/sys/kern/syscalls.master to add an entry for hello. There are multiple types of system calls:
a) STD : always included in the kernel
b) COMPAT : included if COMPAT is #defined
c) LIBCOMPAT : included if COMPAT is #defined and placed in syscalls.h
d) OBSOL : obsolete, and is not included in the kernel.
e) UNIMPL : not implemented yet and only a placeholder is provided for the system call. Each entry in the file has the following format:
systemcall_ number type namespace { systemcall_prototype } syscall_name argument_struct_name return_type
syscall_name, argument_struct_name and return value if not specified are defaulted to systemcall_prototype, 'systemcall_name'_args and int respectively if not supplied. When adding a new system call, always add it to the end of the syscalls.master file. Bump the last sytem call's number by one and assign it to syshello. For example's sake, let us assign number 338 to syshello. The entry for syshello in syscalls.master should look like this:
338 STD BSD { int syshello(char *buf); }
Here, the name of the system call is syshello, the argument name is syshello_args and the return type is int.
2. Run "makesyscalls.sh syscalls.master" in /usr/src/sys/kern directory. This will generate init_sysent.c, syscalls.c and syscalls.h files for you.
3. Now that you have everything in place, the only thing left is to implement the system call. It is a good idea to create a new file to implement the new system call. Basically your philosophy in kernel hacking should be : "Dont touch any existing code unless you really have to" . Believe me, it carries a lot of wisdom.Let us name our implementation file sys_hello.c. Every system call is passed two parameters : 1. pointer to struct proc and 2. pointer to the user defined system call argumet structure, which in our case is : syshello_args. The structure syshello_args should be defined by the implementor of the system call and should contain all the arguments to the system call. In our case it should have a pointer to char.
struct syshello_args
{
char *buf;
};
The system call itself should be implemented like this:
int syshello(p, uap)
struct proc* p; struct syshello_args uap;
{
sprintf(uap->buf,"Hello"); /* fill the buffer with Hello */
p->p_retval[0] = 0; /* set the return value of the system call*/
return 0;
}
4. Modify the Makefile to include sys_hello.c,etc and recompile the kernel.
5. Boot the new kernel and viola, we are all set. You would ofcourse, do more meaningful stuff within your system call implementation. To invoke your new system call from a user program, just use another systemcall, syscall (more info can be obtained via the man pages of syscall).